作者:张富春(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. vue2升级vue3:webpack vue-loader 打包配置

    如果没有啥特别的需求还是推荐vue-cli! vite  vue3 TSX项目 虽然vite 很香,但是vite  rollup 动态加载,多页面 等问题比较难搞 vite的缺点 wepback  _ ...

  2. 中国人的 Java 生态,Solon v2.5.3 发布

    Solon 是什么? 国产的 Java 应用开发框架.从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模).与其他框架相比,解决了两个重要的痛点:启动慢,费内存. 关键记事 ...

  3. Axure 多人协作

    创建团队项目 团队 => 从当前文件创建团队项目 签出的文件才能被修改 签出 签入 发布评论 邀请 编辑的5种状态 和SVN差不多的概念 已有项目导入 https://www.bilibili. ...

  4. FileLock 多进程文件锁

    FileLock是文件锁,它能保证同一时间只有一个进程(程序)能够修改它,或者都只可以读,这样就解决了多进程间的同步文件,保证了安全性.但是需要注意的是,它进程级别的,不是线程级别的,他可以解决多个进 ...

  5. selenium 访问无等待

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities desired_capabilities ...

  6. 聊聊损失函数1. 噪声鲁棒损失函数简析 & 代码实现

    今天来聊聊非常规的损失函数.在常用的分类交叉熵,以及回归均方误差之外,针对训练样本可能存在的数据长尾,标签噪声,数据不均衡等问题,我们来聊聊适用不同场景有针对性的损失函数.第一章我们介绍,当标注标签存 ...

  7. Vue框架基础

    博客目录 前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令.事件指令.属性指令 style和class 条件渲染 列表渲染 使用v-for进行循环 监控失效 双向数据绑定 input输入框 ...

  8. 解读IDC《中国视频云市场跟踪》最新报告,视频云将趋向何方?

    国际权威咨询公司IDC发布<中国视频云市场跟踪(2021 H2)>报告,阿里云连续四年稳居中国视频云整体市场份额第一,整体市场份额占比达26.9%. 时至2021,中国视频云的数字背后 近 ...

  9. 【AcWing】第6场周赛 B题 3734. 求和 (思维)

    AcWing 3734. 求和 其实这道题并不难,只是思维性很强! 因为 \(a\) 的各个数位不包含除了 \(4\) 和 \(7\)​ 以外的其他数字. 仔细观察数据会发现因为 \(1\le l \ ...

  10. AtCoder Beginner Contest 188 题解

    AtCoder Beginner Contest 188 A,B很简单就不多说 C - ABC Tournament 找出前一半的最大值和后一半的最大值,二者中较小的那一个对应的序号就是最后的答案. ...