kubernetes 笔记

Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。

kubernetes

如何理解 k8s 对象这个概念? 使用 Kubernetes 对象

k8s 可以有多个节点(Node),每个节点可以有多个 POD,pod 是一组(一个或多个)容器。

Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 节点可以是一个虚拟机或者物理机器。

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

每个 Pod 一个容器”模型是最常见的 Kubernetes 用例。

为了让用户的日子略微好过一些,你并不需要直接管理每个 Pod。 相反,你可以使用 负载资源 来替你管理一组 Pods。 这些资源配置 控制器 来确保合适类型的、处于运行状态的 Pod 个数是正确的,与你所指定的状态相一致。Kubernetes 提供若干种内置的 工作负载资源

  • DeploymentReplicaSet (替换原来的资源 ReplicationController)。 Deployment 很适合用来管理你的集群上的无状态应用,Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被换掉。

  • StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pods。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。

  • DaemonSet 定义提供节点本地支撑设施的 Pods。这些 Pods 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某 DaemonSet 的规约匹配,则控制面会为该 DaemonSet 调度一个 Pod 到该新节点上运行。

  • JobCronJob。 定义一些一直运行到结束并停止的任务。Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。

如何 使用 Pod ,通常你不需要直接创建 Pod,甚至单实例 Pod。 相反,你会使用诸如 DeploymentJob 这类工作负载资源 来创建 Pod。如果 Pod 需要跟踪状态, 可以考虑 StatefulSet 资源。

你很少在 Kubernetes 中直接创建一个个的 Pod,甚至是单实例(Singleton)的 Pod。 这是因为 Pod 被设计成了相对临时性的、用后即抛的一次性实体。

负载资源的控制器通常使用 Pod 模板(Pod Template) 来替你创建 Pod 并管理它们。Pod 模板是包含在工作负载对象中的规范(specification),用来创建 Pod。

理解 pod metadata 元数据字段和 spec 字段、选择算符 等字段,查看 编写 ReplicaSet 的 spec创建 Deployment编写 Deployment 规约

ReplicaSet 并不直接支持滚动更新。

ReplicaSet 的替代方案Deployment 是一个 可以拥有 ReplicaSet 并使用声明式方式在服务器端完成对 Pods 滚动更新的对象。建议你在需要 ReplicaSet 时使用 Deployment。

以 XX 视联基础平台流媒体服务为例,Deployment 从来都是只创建一个副本,那么滚动更新还有意义吗?

1
2
3
# 两个命令有什么区别
kubectl apply -f xxx.ymal
kubectl create -f xxx.yaml

kubectl exec 有没有 -- 什么区别 ?可以通过 kubectl exec --help 看到:

If the command you want to execute in the pod has any flags in common (e.g. -i),

you must use two dashes (–) to separate your command’s flags/arguments.

学习 Kubernetes 基础知识

  1. 创建一个 Kubernetes 集群 ,使用 Minikube 创建集群

  2. 部署应用程序 ,使用 kubectl 创建 Deployment

  3. 应用程序探索 ,查看 pod 和工作节点

  4. 应用外部可见 ,使用 Service 暴露您的应用

  5. 应用可扩展 ,运行应用程序的多个实例

  6. 应用更新 , 执行滚动更新

kubernetes 拥有哪些资源?

Use “kubectl api-resources” for a complete list of supported resources.

K8S 的 Service 类型 ,名字就是理解的关键:ClusterIP 和 NodePort ,基础平台目前(2022年1月25日)只用到这两种。

在 POD 内可以通过 service name 访问目标 pod ,@todo 此处的 service name 是主机名吗?

使用 NAT 将集群内 Service 暴露到 NODE 的指定端口上。

特定于华为云的环境下:

  • POD 使用的地址:B 类地址的保留地址段:172.16.0.0–172.31.255.255

  • ClusterIP 使用的地址:A 类地址的保留地址段:10.0.0.0–10.255.255.255

  • NODE 使用的地址:A 类地址的保留地址段:10.0.0.0–10.255.255.255

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@master log]# kk webuas
kubectl exec -it vms-webuas-65d49698c9-2ckrk bash
[root@vms-webuas-65d49698c9-2ckrk /]# ping vms-webuas-65d49698c9-2ckrk
PING vms-webuas-65d49698c9-2ckrk (172.24.219.179) 56(84) bytes of data.
64 bytes from vms-webuas-65d49698c9-2ckrk (172.24.219.179): icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from vms-webuas-65d49698c9-2ckrk (172.24.219.179): icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from vms-webuas-65d49698c9-2ckrk (172.24.219.179): icmp_seq=3 ttl=64 time=0.026 ms
^C^C
--- vms-webuas-65d49698c9-2ckrk ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.021/0.028/0.039/0.009 ms
[root@vms-webuas-65d49698c9-2ckrk /]# ping vms-webuas
PING vms-webuas.default.svc.cluster.local (10.110.170.40) 56(84) bytes of data.
64 bytes from vms-webuas.default.svc.cluster.local (10.110.170.40): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from vms-webuas.default.svc.cluster.local (10.110.170.40): icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from vms-webuas.default.svc.cluster.local (10.110.170.40): icmp_seq=3 ttl=64 time=0.030 ms
^C
--- vms-webuas.default.svc.cluster.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.030/0.037/0.049/0.010 ms
[root@vms-webuas-65d49698c9-2ckrk /]# ^C
[root@vms-webuas-65d49698c9-2ckrk /]#

特定于 k8s 交互式教程(minikube)的环境中:

  • POD 使用的地址:???

  • ClusterIP 使用的地址:A 类地址的保留地址段:10.0.0.0–10.255.255.255

  • NODE 使用的地址:B 类地址的保留地址段:172.16.0.0–172.31.255.255

docker

安装 epel-release 软件包

什么是 EPEL/zh-cn - Fedora Project Wiki

阮一峰老师 - Docker 入门教程

合作厂商A 的 /svn/ACI/ 目录下各脚本,在哪里完成的制作镜像(将生成目标压成了 tar.bz2 压缩包,什么时间拷到镜像里,什么时间解压的)?chenr 反馈可以找 yangg 了解。使用的 Docker 制作镜像时的 ADD 命令:

echo "ADD $RAR /mnt" >> Dockerfile

阮一峰老师 - Nginx 容器教程

  • proxy_pass
  • websocket

在 windows 上安装 docker 本质上也是先启了 linux 的虚拟机,Install Docker Engine on CentOS

The contents of /var/lib/docker/, including images, containers, volumes, and networks, are preserved.

但是这个目录似乎只能查看目录结构 ls ,不能进入 cd

@todo 防火长城带来的网速体验,真的很烦

docker 的操作命令必须使用 root 权限执行吗

nginx 镜像

Configuring HTTPS servers

改掉镜像默认的 80 端口

nginx:alpine 的意义 ,进入容器的方式:docker exec -it 容器id /bin/sh

如果是 nginx:latest 容器,进入的命令就可以使用: docker exec -it 容器id bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试基础镜像
docker container run -d -p 127.0.0.1:8080:80 --rm --name mynginx nginx:1.21.5
# 制作镜像
docker image build -t vms-stdu-nginx:0.1 .
# 查看镜像
docker image ls | grep nginx
# 删除镜像
docker image rm vms-stdu-nginx:0.1
# 启动容器
docker container run -d -p 127.0.0.1:8780:8780 --rm --name vms-stdu-nginx vms-stdu-nginx:0.7
# 进入容器
docker exec -it 容器id bash
# 查看容器日志,调试
docker logs 容器id
# 测试 nginx 配置
nginx -t

证书相关: pem 文件如何正确使用

配置文件中证书使用 *tower*.cn.pem 匹配不到证书文件,使用完整的名称可以。

nginx use $server_name on ssl_certificate path - Server Fault

nginx server_name regex capture not getting substituted in ssl_certificate - Stack Overflow

容器内存在默认的配置,但将容器外面的目录挂载到容器内后,这些默认配置都不可见了。Docker volume 挂载时文件或文件夹不存在 。@todo 怎么办呢?

nginx 使用

CommandLine | NGINX

-v Print version.
-t Don’t run, just test the configuration file.

linux tar打包压缩排除某个目录或文件 ,注意细节。