1、初识Pod
WHAT :它只是一个逻辑概念、是一种编排思想、 k8s 中最小编排单位,k8s 处理的还是宿主机上 Linux 的Namespace和 CgrousWHY :
- 一些容器更适合放在一起紧密协作
- 容器的日志收集
对与上面的容器的日志收集,举例:有一个应用,需要不断地把日志文件输出到容器的 /var/log 目录,这时我们把一个Pod 里的 Volume 挂载到应用容器的 /var/log 目录上。然后在这个Pod里运行一个 sidecar 容器,也声明挂载同一个Volume 到自己的 /var/log 目录上。sidecar 容器就只需要做一件事儿,就是不断地从自己的 /var/log 目录里读取日志文件,转发到 MongoDB 或者Elasticsearch 中存储起来。一个最基本的日志收集工作就完成了。
1.2、Pod中几个重要字段的含义和用法
apiVersion: v1kind: Pod...spec:hostAliases: - ip: "10.1.2.3"hostnames: - "foo.remote" - "bar.remote"...
apiVersion: v1kind: Podmetadata:name: nginxspec:shareProcessNamespace: truecontainers:- name: nginximage: nginx - name: shellimage: busyboxstdin: truetty: tru
tty:Linux 给用户提供的一个常驻小程序,用于接收用户的标准输入,返回操作系统的标准输出
stdin :为了能够在 tty 中输入信息,还需要同时开启stdin(标准输入流)。
apiVersion: v1
kind: Podmetadata:name: nginxspec:hostNetwork: truehostIPC: truehostPID: truecontainers: - name: nginximage: nginx - name: shellimage: busyboxstdin: truetty: true
1.2.1、Container是Pod中最重要的字段
- ImagePullPolicy:定义了镜像拉取的策略
- 默认是 Always,即每次创建 Pod 都重新拉取一次镜像。
- 可以定义为 Never 或者 IfNotPresent,则意味着 Pod 永远不会主动拉取这个镜像,或者只在宿主机上不存在这个镜像时才拉取。
- Lifecycle:定义的是 Container Lifecycle Hooks。在容器状态发生变化时触发一系列“钩子” 。如下例子:
apiVersion: v1kind: Podmetadata:name: lifecycledemospec:containers:- name: lifecycledemocontainerimage: nginxlifecycle:postStart:exec:command: ["/bin/sh" , "c" , "echoHello from the postStart handler > /usr/share/message"]preStop:exec:command: ["/usr/sbin/nginx" , "-s" , "quit"]
postStart :在容器启动后,立刻执行一个指定的操作。
- 该操作虽然是在 Docker 容器 ENTRYPOINT 执行之后,但它并不严格保证顺序。也就是说,在 postStart 启动时,ENTRYPOINT 有可能还没有结束。
- 执行超时或者错误,Kubernetes 会在该 Pod 的Events 中报出该容器启动失败的错误信息,导致 Pod 也处于失败的状态。
preStop : preStop 发生的时机,则是容器被杀死之前(比如,收到了 SIGKILL 信号)。 preStop 操作的执行,是同步 的,它会阻塞当前的容器杀死流程,直到这个 Hook 定义操作完成之后,才允许容器被杀死
3、Pod的几种状态
- Pending:这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。
- Running:这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至s" , "quit"]少有一个正在运行中。
- Succeeded:这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。
- Failed:这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的Events 和日志。
- Unknown:这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。
4、水平扩展和滚动升级
apiVersion: apps/v1kind: ReplicaSetmetadata:name: nginxsetlabels:app: nginxspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9
它定义的 Pod 副本个数是 3(spec.replicas=3)。
5、RBAC:基于角色的权限控制
- Role:角色,它其实是一组规则,定义了一组对Kubernetes API 对象的操作权限。
- Subject:被作用者,既可以是“人” ,也可以是“机器” ,也可以使你在 Kubernetes 里定义的“用户” 。
- RoleBinding:定义了“被作用者”和“角色”的绑定关系。
kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:namespace: mynamespacename: examplerolerules:- apiGroups: [""]resources: ["pods"]verbs: ["get" , "watch" , "list"]...secrets:- name: examplesatokenvmfg6
6、Operator 工作原理
$ git clone https://github.com/coreos/etcd-operator
$ example/rbac/create_role.sh
上述脚本为 Etcd Operator 定义了如下所示的权限:
- 对 Pod、Service、PVC、Deployment、Secret 等 API对象,有所有权限;
- 对 CRD 对象,有所有权限;
- 对属于 etcd.database.coreos.com 这个 API Group 的CR(Custom Resource)对象,有所有权限。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: etcdoperator
spec:
replicas: 1
template:
metadata:
labels:
name: etcdoperator
spec:
containers:
- name: etcdoperator
image: quay.io/coreos/etcdoperator:v0.9.2
command:
- etcdoperator
env:
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
...
使用上述的 YAML 文件来创建 Etcd Operator
kubectl create f example/deployment.yaml
etcd Operator 的 Pod 进入了 Running 状态,就有一个CRD 被自动创建了出来,如下所示:
$kubectl get podsNAME READYSTATUS RESTARTS AGEetcdoperator649dbdb5cbbzfzp 1/1Running 0 20s$kubectl get crdNAMECREATED ATetcdclusters.etcd.database.coreos.com 2020-0918T11:42:55Z
这个 CRD 名叫 etcdclusters.etcd.database.coreos.com
可以通过 kubectl describe 命令看到它的细节
$ kubectl apply -f example/example-etcd-cluster.yaml
$ kubectl get pods
NAME READYSTATUS RESTARTS AGEexampleetcdclusterdp8nqtjznc 1/1Running 0 1mexampleetcdclustermbzlg6sd56 1/1Running 0 2mexampleetcdclusterv6v6s6stxd 1/1Running 0 2m
以上就完成了Etcd集群