2023年1月10日 开发 k8s 管理平台 - k8sailor 17. Pod 的阶段(phase)与状态(status) 原文地址: https://tangx.in/posts/books/k8sailor/chapter02/17-pod-phase-and-status/ Pod 的生命周期 https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/ Pod 的 Status 不是 Phase。 Pod 的 Status 需要根据 Pod 中的 ContainerStatuses 进行计算得到。 Phase 阶段 描述 Pending(悬决) Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜……
阅读全文
2023年1月10日 开发 k8s 管理平台 - k8sailor 19. 为 Deployment 创建 Service 原文地址: https://tangx.in/posts/books/k8sailor/chapter02/19-create-service/ tag: https://github.com/tangx/k8sailor/tree/feat/19-create-service https://kubernetes.io/zh/docs/concepts/services-networking/service/#externalname 1 2 3 kubectl create service clusterip nginx-web --clusterip="port:targetPort" kubectl create service clusterip nginx-web --clusterip="8082:80" kubectl create service nodeport nginx-web --clusterip="8081:80" 需要注意, 使用 kubectl get service 查看到的 Ports 的展示结果为 port:nodePort, 而 targetPort 不展示。 1 2 3 # kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demo-nginx-nodeport-3 NodePort 10.43.181.29 <none> 80:32425/TCP 4s port, targetPort, nodePort 端口映射中的四个 比较关键 的要素: name: 避免端口相同时,默认名字冲突 port:……
阅读全文
2023年1月10日 开发 k8s 管理平台 - k8sailor 20. 为 Deployment 创建 Ingress 原文地址: https://tangx.in/posts/books/k8sailor/chapter02/01-install-k3s-cluster/ tag: https://github.com/tangx/k8sailor/tree/feat/20-create-ingress k8s ingress https://kubernetes.io/zh/docs/concepts/services-networking/ingress/ 1 2 3 4 # Create an ingress with a default backend kubectl create ingress ingdefault --class=default \ --default-backend=defaultsvc:http \ --rule="foo.com/*=svc:8080,tls=secret1" --dry-run -o yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: creationTimestamp: null name: ingdefault spec: defaultBackend: service: name: defaultsvc port: name: http ingressClassName: default rules: - host: foo.com http: paths: - backend: service: name: svc port: number: 8080 path: / pathType: Prefix # 匹配方式 tls: - hosts: - foo.com secretName: secret1 status: loadBalancer: {} 路径类型 Ingress 中的每个……
阅读全文
2023年1月9日 这些关于 Golang timezone 时区的坑, 我已经帮你踩过了 原文链接: https://tangx.in/posts/2023/01/09/golang-timezone-issue/ Golang 中一些不太注意的时区问题 1. time/tzdata 库 Golang 内置的一个时区文件。 可以在程序中任意位置被导入。 导入后, 如果程序 找不到本地 时区文件, 就会使用该库的数据。 本地 指的是 运行环境, 可能是实际的服务器, 也可能是容器。 通常, 应该在 main.go 中被导入。 如果是 库代码 则……
阅读全文
2023年1月9日 使用 kuberbuilder 初始化项目 代码在: https://github.com/tangx/kubebuilder-zero-to-one 1 2 kubebuilder init --domain tangx.in kubebuilder create api --group myapp --version v1 --kind Redis 1 2 3 4 5 6 7 8 9 apiVersion: myapp.tangx.in/v1 kind: Redis metadata: name: my-op-redis spec: replicas: 1 port: 3333 1 2 3 4 5 # 安装 make install # 卸载 make uninstall 查看 crd 1 2 3 k get crd |grep tangx.in redis.myapp.tangx.in 2021-11-19T06:16:43Z……
阅读全文
2023年1月9日 定义对象 CRD 字段, 实现第一个 DEMO 代码在: https://github.com/tangx/kubebuilder-zero-to-one 定义 CRD Redis 对象字段 在 /api/v1/redis_types.go 中, 增加 Replicas 和 Port 字段。 1 2 3 4 5 6 7 8 9 type RedisSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file // Foo is an example field of Redis. Edit redis_types.go to remove/update // Foo string `json:"foo,omitempty"` Replicas int `json:"replicas,omitempty"` Port int32 `json:"port,omitempty"` } 这个 RedisSpec 对应 /deploy/my-op-redis.yml 中的 spec 1 2 3 4 5 6 7 8 9 10 apiVersion: myapp.tangx.in/v1 kind: Redis metadata: name: my-op-redis spec: replicas: 1 port: 3333 编码 Reconcile 调谐逻辑 在 /controllers/redis_controller.go 中编码 R……
阅读全文
2023年1月9日 优化配置 发布 crd controller 到集群 设置 docker server 网络代理, 避免编译的时候下载所依赖的 gcr.io 镜像失败。 参考文章 设置 docker server 网路代理 修改 Makefile, 设置默认 image name 1 2 3 4 VERSION ?= v$(shell cat .version) # Image URL to use all building/pushing image targets IMG ?= cr.docker.tangx.in/jtredis/controller:$(VERSION) 修改镜像 pull 策略。 在 /config/manager/manager.yaml 配置文件中, 添加 imagePullPolicy 策略。 由于本地开发, 并不准备上传到云上, 所以设置为 IfNotPresent。 1 2……
阅读全文
2023年1月9日 使用注解完整字段值约束 代码在: https://github.com/tangx/kubebuilder-zero-to-one 在 /api/v1/redis_types.go 中,使用注解完成字段值约束。 约束条件必须以 //+kubebuilder:validation:<METHOD>:=<VALUE> 为格式, 符号之间 没有空格。 约束条件必须 紧邻 字段, 且在字段上方。 https://book.kubebuilder.io/reference/markers/crd-validation.html 1 2 3 4 5 6 7 8 9 10 type RedisSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file Replicas int `json:"replicas,omitempty"` //+kubebuilder:validation:Minimum:=1234 //+kubebuilder:validation:Maximum:=54321 Port int32 `json:"port,omitempty"` } 重新编译安装 1 make install 使用命令查看查看 1 2 3 4 5 6 7……
阅读全文
2023年1月9日 通过 webhook 进行字段验证 代码在: https://github.com/tangx/kubebuilder-zero-to-one 通过 kubebuilder 生成代码 1 2 3 4 5 # 创建 api kubebuilder create api --group myapp --version v1 --kind Redis # 创建 api 的 webhook kubebuilder create webhook --group myapp --version v1 --kind Redis --defaulting --programmatic-validation 增加 webhook 条件 在 /api/v1/redis_webhook.go 中增加检查条件。 检查 webhook 被触发有三个条件 Create / Update / Delete 时间节点, 分别对应三个方法。 如下是 创建时检查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func (r *Redis) ValidateCreate() error { redislog.Info("validate create", "name", r.Name) // 条件判断 if……
阅读全文
2023年1月9日 使用 Operator 创建并发布一个 Pod 代码在: https://github.com/tangx/kubebuilder-zero-to-one 1. 组装 k8s api 创建 pod 创建 /controllers/helper 目录, 这里面的代码实现 k8s Workloads 的创建。 具体实现就是封装 k8s workloads 的 api 对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // CreateRedis 创建 redis pod func CreateRedisPod2(ctx context.Context, client client.Client, config *appv1.Redis) error { pod := &corev1.Pod{} pod.Name = config.Name pod.Namespace = config.Namespace pod.Spec.Containers = []corev1.Container{ { Name: config.Name, Image: config.Spec.Image, ImagePullPolicy: corev1.PullIfNotPresent, Ports: []corev1.ContainerPort{ { ContainerPort: config.Spec.Port, }, }, }, } // ctx := context.Background() return client.Create(ctx, pod) } 补充说明一下,为什么要……
阅读全文