主要记录最近遇到的一些开发问题,解决方法。
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 root@$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
| 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
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
|
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
|