目录

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

    1. 本地快速切换不同 Kubernetes 环境

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

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

    function on_kubernetes() {
       # 10.10.10.10  kubernetes.default
       if test -f ~/.kube/config.bk; then
         rm -rf ~/.kube/config.bk
       fi
       if test -f ~/.kube/config; then
         mv ~/.kube/config ~/.kube/config.bk
       fi
       sed -i'.s' -e '/kubernetes.default/d'  ~/.ssh/known_hosts
       sshpass  -p "YourPassword" ssh -o StrictHostKeyChecking=no [email protected] "cat /etc/kubernetes/admin.conf" > ~/.kube/config
       sed -i'.s' -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}'/kubernetes.default/ ~/.kube/config
    }
    

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

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

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

    需要安装 Xcode toolkit :

    xcode-select --install
    

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

    sudo xcode-select --reset
    

    3. Dockerfile 多个 From 指令

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

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

    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 容器,共享存储、网络等

      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 容器解决运维故障

    kubectl exec -it {POD_NAME}  -c sidecar sh
    

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