Please enable Javascript to view the contents

开发 Tips(19)

 ·  ☕ 2 分钟

主要记录最近遇到的一些开发问题,解决方法。

1. macOS 快速切换不同 Kubernetes 环境

涉及 Kubernetes 相关开发时,经常需要在多个集群之间切换。配置多集群 context 是一个选择,但是如果集群在不断重置,可以试下如下方法:

~/.profile 文件中定义一系列相关 function,切换时只需要执行 on_cluster_name 即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Switch Kubernetes Cluster
function switch_kubeconfig(){
   sudo sed -i "" "/$2/d" /etc/hosts
   sudo echo "$1 $2" >> /etc/hosts

   if test -f ~/.ssh/known_hosts; then
     sed -i "" '/kubernetes.default/d'  ~/.ssh/known_hosts
   fi
   sshpass  -p "your_password" ssh -o StrictHostKeyChecking=no [email protected]$1 "cat /etc/kubernetes/admin.conf" > ~/.kube/config
}
function on_dev1(){
   switch_kubeconfig 10.10.10.11 kubernetes.default
}

2. OS X 上,执行 git 命令报错,xcrun: error

升级最新版本 OS X 之后,执行 git pull 命令,提示错误:

1
2
3
4
git pull

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools),
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

需要安装 Xcode toolkit :

1
xcode-select --install

如果依然报错,可以尝试重置:

1
sudo xcode-select --reset

3. Dockerfile 多个 From 指令

多个 From 指令生成的镜像,以最后一个 From 为准。

多个 From 指令是为了区分不同构建阶段,比如,构建与运行环境的分离。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM golang:1.12 as controller-manager-builder

COPY / /go/src/myapp
WORKDIR /go/src/myapp

RUN CGO_ENABLED=0 GO111MODULE=on GOOS=linux GOARCH=amd64 GOFLAGS=-mod=vendor go build --ldflags "-extldflags -static" -o controller-manager ./cmd/controller-manager/

FROM alpine:3.7
RUN apk add --update ca-certificates && update-ca-certificates
COPY --from=controller-manager-builder /go/src/myapp/controller-manager /usr/local/bin/
CMD controller-manager

golang 镜像用于构建源码,alpine 镜像用于运行程序,两者的关联在于 COPY --from= 将二进制从一个镜像拷贝到另外一个镜像。

4. 给 Pod 附加容器,调试 Kubernetes 运行环境

在 Service Mesh 中,为了减少对原有系统的干扰,推荐采用 Sidecar 模式进行设计和实践。Sidecar 设计模式可以给应用程序添加新的功能,而无需额外第三方组件的配置和代码。

借助 Sidecar ,可以对运行中的容器或未运行的容器环境进行处理,解决一些运维问题。

第一步,添加 Sidecar 容器,共享存储、网络等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  Containers:
    - name: sidecar
      image: busybox:1.28.4
      command:
        - sleep
        - "3600"
      imagePullPolicy: IfNotPresent
      resources: {}
      terminationMessagePath: /dev/termination-log
      terminationMessagePolicy: File
      volumeMounts:
        - name: db-persistent-storage
          mountPath: /var/lib/mysql

第二步,进入 Sidecar 容器解决运维故障

1
kubectl exec -it {POD_NAME}  -c sidecar sh

参考,Istio Sidecar 注入:例外和除错

5. CentOS 7 安装 GLIBC 2.18

  • 查看已经安装的 GLIBC 版本
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
strings /lib64/libc.so.6 |grep GLIBC_*

GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
  • 安装 GLIBC 2.18
1
2
3
4
5
6
7
wget http://ftp.gnu.org/gnu/glibc/glibc-2.XX.tar.gz
tar -xvf glibc-2.18.tar.gz
cd glibc-2.18
mkdir build && cd build
../configure --prefix=/usr
make -j4
make install

微信公众号
作者
微信公众号