作者:张富春(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.

MacBook m2 笔记本 + k8s容器环境开发笔记的更多相关文章

  1. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

  2. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  3. CoolBlog开发笔记第2课:搭建开发环境

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 前言 今天是CoolBlog开发笔记的第2课,我们将要讲解的是开发环境的搭建.俗话说"工欲善其事必先利其器",Djang ...

  4. Java开发笔记(七十一)容器工具Collections

    清单作为一组数据的有序队列,它在组织形式上与数组有着某些异曲同工之处,数组有专门的数组工具Arrays来进行加工操作,照理清单也应该配备对应的清单工具.当然容器这个大家族确实拥有自己的容器工具Coll ...

  5. ArcGIS API for javascript开发笔记(二)——解决ArcGIS Service中的服务在内网环境下无法进行javascript预览问题

    感谢一路走来默默支持和陪伴的你~~~ ----------------------------拒绝转载-------------------------------- 1.问题说明 在使用ArcGIS ...

  6. 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记

    近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...

  7. wechat开发笔记之1.线上环境搭建与测试

    Wechat开发笔记 线上环境搭建: 申请一个wechat公众平台. 手机个人微信可以用webwechat来测试. Website:https://web.weixin.qq.com/ 手机客户端扫一 ...

  8. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  9. @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本

    今天遇到了很奇葩的问题,我本机的是以test环境启动的,调用另一个服务接口的时候返回参数却不同,调用接口是没错,怎么会这样,排查了很久,发现在eureka上注册的另一个服务是testone环境,而这个 ...

  10. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

随机推荐

  1. Git hooks与自动化部署

    好的 commit message 是至关重要的,如果随意编写 log,带来的后果可小可大,但是无论大小都影响了开发的效率和回朔的难度,所以有必要进行 log 规范化检查. 通过自定义的commit ...

  2. Windows系统快速安装Superset 0.37

    Windows系统安装Superset 0.37 Superset 是一款由 Airbnb 开源的"现代化的企业级 BI(商业智能) Web 应用程序",其通过创建和分享 dash ...

  3. app上架一直显示审核中状态要怎么处理?

    ​ 当你提交一个应用到App Store上时,它会经历一个审核过程.在这个过程中,苹果的审核人员会检查你的应用是否符合苹果的规定和标准.这个过程通常需要几天的时间,但是如果你的应用一直显示" ...

  4. Hugging News #0113:DreamBooth 编程马拉松活动保姆级视频教程来了!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. vim-修改键盘Tab键为四个空格

    在 /etc/vimrc 文件后添加一行 set ts=4

  6. 【JAVA基础】日志管理

    LOGGER.debug("Request uri: {}, headers: {}", signedRequest.getURI(), signedRequest.getAllH ...

  7. [kuangbin] 专题13 基础计算几何 题解 + 总结

    kuangbin带你飞:点击进入新世界 [kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html kuang ...

  8. Sentinel 是如何做限流的

    限流是保障服务高可用的方式之一,尤其是在微服务架构中,对接口或资源进行限流可以有效地保障服务的可用性和稳定性. 之前的项目中使用的限流措施主要是Guava的RateLimiter.RateLimite ...

  9. zzuli 1907: 小火山的宝藏收益

    ***题意:中文的 做法:邻接表+DFS,就相当于搜一棵树,比较一下当前结点得到的宝藏多还是子树下面得到的宝藏多,仔细想想就是水题*** #include<iostream> #inclu ...

  10. 大数相乘 a*b

    //zznu 1562//用数组模拟乘法计算的过程 #include<iostream> #include<stdio.h> #include<string.h> ...