kubernetes 笔记
Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
kubernetes
如何理解 k8s 对象这个概念? 使用 Kubernetes 对象
k8s 可以有多个节点(Node),每个节点可以有多个 POD,pod 是一组(一个或多个)容器。
Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 节点可以是一个虚拟机或者物理机器。
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
每个 Pod 一个容器”模型是最常见的 Kubernetes 用例。
为了让用户的日子略微好过一些,你并不需要直接管理每个 Pod。 相反,你可以使用 负载资源 来替你管理一组 Pods。 这些资源配置 控制器 来确保合适类型的、处于运行状态的 Pod 个数是正确的,与你所指定的状态相一致。Kubernetes 提供若干种内置的 工作负载资源 :
Deployment 和 ReplicaSet (替换原来的资源 ReplicationController)。
Deployment
很适合用来管理你的集群上的无状态应用,Deployment
中的所有Pod
都是相互等价的,并且在需要的时候被换掉。StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pods。 例如,如果你的负载会将数据作持久存储,你可以运行一个
StatefulSet
,将每个Pod
与某个PersistentVolume
对应起来。你在StatefulSet
中各个Pod
内运行的代码可以将数据复制到同一StatefulSet
中的其它Pod
中以提高整体的服务可靠性。DaemonSet 定义提供节点本地支撑设施的
Pods
。这些 Pods 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某DaemonSet
的规约匹配,则控制面会为该DaemonSet
调度一个Pod
到该新节点上运行。Job 和 CronJob。 定义一些一直运行到结束并停止的任务。
Job
用来表达的是一次性的任务,而CronJob
会根据其时间规划反复运行。
如何 使用 Pod ,通常你不需要直接创建 Pod,甚至单实例 Pod。 相反,你会使用诸如 Deployment 或 Job 这类工作负载资源 来创建 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 | 两个命令有什么区别 |
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 集群 ,使用 Minikube 创建集群
部署应用程序 ,使用 kubectl 创建 Deployment
应用程序探索 ,查看 pod 和工作节点
应用外部可见 ,使用 Service 暴露您的应用
应用可扩展 ,运行应用程序的多个实例
应用更新 , 执行滚动更新
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 | [root@master log]# kk webuas |
特定于 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/zh-cn - Fedora Project Wiki
合作厂商A 的 /svn/ACI/
目录下各脚本,在哪里完成的制作镜像(将生成目标压成了 tar.bz2
压缩包,什么时间拷到镜像里,什么时间解压的)?chenr 反馈可以找 yangg 了解。使用的 Docker 制作镜像时的 ADD 命令:
echo "ADD $RAR /mnt" >> Dockerfile
- 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 镜像
nginx:alpine 的意义 ,进入容器的方式:docker exec -it 容器id /bin/sh
如果是 nginx:latest 容器,进入的命令就可以使用: docker exec -it 容器id bash
1 | 测试基础镜像 |
证书相关: 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 使用
-v |
Print version. |
---|---|
-t |
Don’t run, just test the configuration file. |
linux tar打包压缩排除某个目录或文件 ,注意细节。