MacBook m2 笔记本 + k8s容器环境开发笔记

发布时间 2023-06-01 16:07:10作者: ahfuzhang

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


为最近两周在 MacBook m2 + k8s 容器环境的开发做一个笔记。

编译

如果编译为 m2芯片原生的 darwin + aarch64 格式,直接调试即可。

可 k8s 环境中的机器都是 linux + amd64,所以需要交叉编译。

1.安装交叉编译工具

brew tap messense/macos-cross-toolchains
# install x86_64-unknown-linux-gnu toolchain
brew install x86_64-unknown-linux-gnu
# install aarch64-unknown-linux-gnu toolchain
brew install aarch64-unknown-linux-gnu

安装好以后进行测试:

x86_64-linux-gnu-gcc —help
aarch64-linux-gnu-gcc —help

2.golang 的编译命令行

Makefile:

build_linux_amd:
	env CC=x86_64-linux-gnu-gcc CGO_ENABLED=1  GOOS=linux  GOARCH=amd64 CGO_LDFLAGS="-static" \
	  go build -o cmd/cli/redirector_linux_amd cmd/cli/main.go

重点是两个:

  • CC=x86_64-linux-gnu-gcc: 指定交叉编译的编译器。否则 gozstd 这样的库无法编译
  • CGO_LDFLAGS="-static": 一定要静态链接,否则就会因为缺失动态库导致无法运行

镜像

3.使用 Dockerfile 来打包

Dockerfile_linux_amd64:

FROM --platform=linux/amd64 alpine:3.18.0

ADD cmd/cli/redirector_linux_amd /app/
ADD cmd/cli/redirector.yaml /app/
EXPOSE 8080 8082 8083
CMD ["/app/redirector_linux_amd", "-cfg", "/app/redirector.yaml"]
  • 注意,要加上--platform=linux/amd64 来指定平台

然后编译镜像:

Makefile:

docker_linux_amd64:
	docker build -t redirector_linux_amd64:$(tag) --pull=false -f Dockerfile_linux_amd64 .

像这样执行:make docker_linux_amd64 tag=v0.0.1

4.测试容器中的程序

注意:m1 芯片上运行 amd64 格式的镜像,会用到 macos 提供的虚拟机(或者是做指令翻译的系统进程)。如果做压测的话,会看见这个进程的CPU非常高。

Makefile:

docker_run_linux_amd64:
	    docker run --cpus=1 --cpuset-cpus="1" -m 1G \
	    --rm --name redirector_linux_amd64 -p 8080:8080 -p 8082:8082 \
	    redirector_linux_amd64:$(tag)

这样执行:make docker_run_linux_amd64 tag=v0.0.1

注意:

  • 没有使用 -d 选项,所以进程会卡住终端,直到按 ctrl + c
  • --rm选项会在容器退出后自动删除容器

5.推送镜像到 docker harbor

docker login --username=ahfu harbor.xxx.com  #登录
docker tag redirector_linux_amd64:v0.0.1 harbor.xxx.com/path/redirector:v0.0.1
docker push harbor.xxx.com/path/redirector:v0.0.1

k8s 环境配置

6. k8s 环境及其 kubectl 命令行工具

首先,需要 k8s 群集的运维同学提供 k8s 的配置文件 k8s.yaml,文件看起来长这样:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS....LS0K
    server: https://10.151.0.1:6443
  name: default
contexts:
- context:
    cluster: default
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
  user:
    client-certificate-data: LS....Cg==
    client-key-data: LS0.....LQo=
    

把这个文件的路径加到环境变量中:

export KUBECONFIG=/Users/fuchunzhang/Documents/WORK/k8s.yaml

安装 kubectl 工具:brew install kubectl

然后就可以使用 kubectl命令行进行玩耍了:

kubectl config view # 查看配置
kubectl cluster-info  # 查看群集
kubectl get ns  # 查看 namespace
kubectl get pods  # 查看容器

6.1 操作 k8s 的 web ui

命令行学起来毕竟有成本,也可以选择 web ui 来查看和管理 k8s 群集:

brew install octant
octant  # 运行

然后会弹出浏览器窗口,可以管理k8s 资源。octant 是免费的哦。

7.私有镜像仓库的鉴权

镜像仓库是私有的,k8s 环境需要鉴权才能从私有的镜像仓库拉到镜像。

先要建立一个 k8s 上的 secret:

kubectl create secret docker-registry regcred-ahfuzhang \
  --docker-server=harbor.xxx.com \
  --docker-username=ahfuzhang \
  --docker-password=my_pass_word \
  --docker-email=ahfuzhang@163.com \
  --namespace=my-test-devops

然后就会以我的账号在 k8s 上建立一个 secret。可以这样查看内容:

kubectl get secret regcred-ahfuzhang --output=yaml --namespace=my-test-devops

然后在创建容器的时候,可以直接引用 regcred-ahfuzhang 这个名字:

spec:
  containers:
  - name: redirectorv03
    image: harbor.xxx.com/path/redirector:v0.0.4
  imagePullSecrets: 
  - name: regcred-ahfuzhang

部署

8.使用 k8s 的 yaml 语法来创建pod 和 service

pod_redirector.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: redirectorv03  #名字
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: redirectorv03  #名字
    image: harbor.xxx.com/path/redirector:v0.0.4
    ports:
      - containerPort: 8080
        name: worker-port
      - containerPort: 8082
        name: profile-port
      - containerPort: 8083
        name: admin-port
    resources:
      requests:
        memory: "512Mi"
        cpu: "2"
      limits:
        memory: "2048Mi"
        cpu: "2"
  imagePullSecrets: 
  - name: regcred-ahfuzhang  # 私有镜像仓库的鉴权
  
---
apiVersion: v1
kind: Service
metadata:
  name: redirectorv03-service
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-work-port
    protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 32101
  - name: name-of-profile-port
    protocol: TCP
    port: 8082
    targetPort: 8082
    nodePort: 32102
  - name: name-of-admin-port
    protocol: TCP
    port: 8083
    targetPort: 8083
    nodePort: 32103

然后用命令行创建 pod:

kubectl apply -f deploy/pod_redirector.yaml --namespace=my-test-devops

如果发现问题可以直接删除掉:

kubectl delete services redirectorv03-service --namespace=my-test-devops && \
kubectl delete pods redirectorv03 --namespace=my-test-devops

Have fun. ?