K8s之pod生命周期、Deployment,Service
K8s之pod生命周期、Deployment,Service
1、Pod
kubernetes中,最基础单元就是Pod。Pod主要用来管理容器,通常Pod中包含的是一个调用链的服务。例如Nginx 和 Django
1.1、Pod的生命周期
[root@k8s-master-01 k8s]# vim pod.yaml
kind: Pod #指定资源名称
apiVersion: v1 #资源版本
#创建资源的基础信息
metadata:
name: test #只能由小写字母中划线数字组成,
namespace: default #指定部署的命名空间
labels: #标签
app:pod #随意定义的标签
spec: #定义容器
containers: #对象列表 可能会存在多个相同对象(或者说配置项)
- name: nginx #容器名称
- image: nginx:latest #容器镜像
# 部署
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
# 查看
[root@k8s-master-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testv1 1/1 Running 0 52s
Pod名称 启动数量 运行状态 重启次数 启动时间
1.2、Pod的重启策略(restartPolicy)
当Pod出现了问题时,Pod怎么解决。
Always :无论什么情况下退出,都重启
OnFailure :只有当非正常情况下退出时,才会重启
Never :无论什么情况下退出,都不重启
1.3、Pod中容器的拉取策略(imagePullPolicy)
容器的 imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取(下载)指定的镜像。
IfNotPresent : 当本地没有该镜像时,下载
Always :无论本地有没有该镜像,都去远程下载
Never :无论本地有没有该镜像,都不去远程下载
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
# 删除Pod
[root@k8s-master-01 k8s]# kubectl delete -f pod.yaml
# 部署Pod
[root@k8s-master-01 k8s]# kubectl apply -f pod.yaml
pod/testv1 created
1.4、静态Pod和动态Pod之间的区别
静态Pod:没有控制器
动态Pod:有控制器 不可抗力宕机 自动重启
1.5、Pod的回调钩子
1.5.1、启动回调
当Pod中所有的容器创建完成之后,立即调用的命令。
执行失败:如果启动回调钩子执行失败,容器无法进入正常启动状态。
exec : 执行命令
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Hello World!' > /root/1.txt"
httpGet : 通过HTTP协议访问
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
httpGet:
port: 80
path: /
host: www.baidu.com
tcpSocket : 通过Ping命令,探测端口
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
tcpSocket:
port: 80
host: 106.13.81.75
1.5.2、就绪性检测
检测容器是否正常运行。
执行失败:如果就绪性检测执行失败,Pod会立即驱离出负载均衡。
exec : 执行命令
httpGet : 通过HTTP协议访问
readinessProbe:
httpGet:
port: 80
path: /index
tcpSocket : 通过Ping命令,探测端口
service
1.5.3、存活性检测(livenessProbe)
检测容器是否正常启动。
执行失败:如果存活性检测执行失败,Pod会按照一定时间周期不断重启,直至Pod正常启动。
exec : 执行命令
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /etc/hostss"
httpGet : 通过HTTP协议访问
livenessProbe:
httpGet:
port: 8080
path: /
tcpSocket : 通过Ping命令,探测端口
livenessProbe:
tcpSocket:
port: 80
控制器
1.5.4、结束回调
当Pod收到了销毁指令时,立即执行。
执行失败:如果结束回调执行失败,容器依然会终止。
exec : 执行命令
httpGet : 通过HTTP协议访问
tcpSocket : 通过Ping命令,探测端口
kind: Pod
apiVersion: v1
metadata:
name: testv1
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx:1.18
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'HelloWorld' > /root/2.txt"
1.6 、查看资源配置项
kubectl explain pod #pod.什么就查看什么的具体命令
kubectl create #创建资源
kubectl get [资源类型] #获取资源列表
kubectl get [资源类型] -o wide #获取资源列表详细信息
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
1.7、标签
kubectl get pods --show-labels #查看容器的所有标签
kubectl get pods -l 标签名=标签值 #查看指定标签的容器
kubectl get pods -L 标签名 #把标签作为一列显示出来
#增加一个标签 资源类型 资源名称 标签名=标签值
kubectl label pod test deploy=stable
#删除一个标签 资源类型 资源名称 标签名
kubectl label pod test deploy-
2、Deployment无状态控制器
k8s中所有的控制器都是用来管理Pod的。Deployment支持滚动更新、版本升级等功能。命名空间级资源
2.1、控制器简介、类型
Deployment为Pod提供声明式更新。在Deployment对象中描述所需的状态,然后Deployment控制器将实际状态以受控的速率更改为所需的状态。您可以定义部署以创建新的副本集,或删除现有部署并在新部署中采用其所有资源。一句话:Deployment主要功能是保证有足够的Pod正常对外提供服务。
无状态控制器:没有先后启动顺序,没有固定节点,没有固定名称 ,标签不变
deployment 是通过标签来管理pod的
deployment控制器会无限接近理想状态 删除或者增加pod
2.1、Deployment案例
kind: Deployment
apiVersion: apps/v1
#创建资源的基础信息
metadata:
name: test-deployment
spec: #管理pod
selector: # 选择Pod 标签选择器里面有两种匹配模式详细看下面的2.5
matchLabels: #精确匹配 标签
app: test-deployment
template: # 定义创建Pod的模板
metadata:
labels: #标签 因为Deployment通过标签管理容器
app: test-deployment
spec: #定义容器
containers:
- name: nginx
image: nginx
#启动
[root@k8s-master-01 k8s]# kubectl apply -f deployment.yaml
#获取控制器
[root@k8s-master-01 k8s]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
test-deployment 1/1 1 1 99s
名字 启动Pod数量 理想状态 当前状态 时间
#查看容器
[root@k8s-master-01 k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-deployment-574644b7-f27b9 1/1 Running 0 45s
控制器名字-token-随机值 启动
不会重复名字-动态pod
#发现删除这个容器之后 会自动新建一个
delete pod test-deployment-76cdbc6456-cmwtd
2.2、Deployment动态扩容
[root@k8s-master-01 k8s]# kubectl scale deployment test-deployment --replicas=10
控制器名称 指定副本数
2.3、Deployment的滚动更新
[root@k8s-master-01 k8s]# kubectl set image deployment/test-deployment nginx=nginx:1.18
设置 镜像 资源名称/基础信息名字 容器名=image版本
deployment.apps/test-deployment image updated
#生成新的容器,旧的先保存 新的生成完成 正常启动 才会停止旧的 在删除
#修改镜像
kubectl edit deployments.apps nginx-deployment
deployment.apps/nginx-deployment edited
2.4、Deployment回滚
# 查看一下部署历史
[root@k8s-master-01 k8s]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
#根据版本
# 回滚到上一个版本
[root@k8s-master-01 k8s]# kubectl rollout undo deployment test-deployment
deployment.apps/test-deployment rolled back
# 回滚到第一个版本(指定版本)
[root@k8s-master-01 k8s]# kubectl rollout undo deployment test-deployment --to-revision=1
deployment.apps/test-deployment rolled back
2.5、Deployment中的标签选择器
在配置清单中,匹配标签的方式有两种:matchLabels 和 matchExpressions
spec: #管理pod
selector:
matchLabels : 精确匹配
matchExpressions : 模糊匹配
-key:app #匹配的是下面的标签名key
operator: In #匹配的模式 分别有
IN #存在
NOTIN #不存在列表
values:
- "deployment"
- "string1"
#上面这些话表示 标签名app 对应下面的template 有一个叫app的标签 并且标签的值在values里面任意一个都ok
2.6、Deployment的配置详解
namespace: 命名空间
labels: 标签
annotations: 注解
replicas: 副本数
kind: Deployment
apiVersion: apps/v1
#创建资源的基础信息
metadata:
name: test-deployment
spec: #管理pod
selector: # 选择Pod 标签选择器里面有两种匹配模式详细看下面的2.5
matchLabels: #精确匹配 标签
app: test-deployment
template: # 定义创建Pod的模板
metadata:
labels: #标签 因为Deployment通过标签管理容器
app: test-deployment
spec: #定义容器
containers:
- name: nginx
image: nginx
2.7、将Django部署到k8s
kind: Deployment
apiVersion: apps/v1
metadata:
name: django
spec:
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- name: django
image: alvinos/django:v1.1
3、Service负载均衡器
作用就是为k8s中的Pod提供负载均衡服务。
动态抓取pod的ip
动态移除或添加pod 实现负载均衡效果
3.1、Service实践
kind: Deployment
apiVersion: apps/v1
metadata:
name: django
spec:
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- name: django
image: alvinos/django:v1
---
kind: Service
apiVersion: v1
metadata:
name: test_svc
spec:
selector:
app: django
ports:
- port: 80 #services的端口
targetPort: 80 #容器的端口
name: http
#kubectl get svc
3.2、ClusterIP
只在集群内部访问。ClusterIP也是默认的Service类型。
---
kind: Service
apiVersion: v1
metadata:
name: django
spec:
selector:
app: django
ports:
- port: 80
targetPort: 80
name: http
type: ClusterIP
clusterIP: 10.96.117.231
3.3、NodePort
利用宿主主机的IP和端口,实现网络转发
NodePort是将主机IP和端口跟kubernetes集群所需要暴露的IP和端口进行关联,方便其对外提供服务。内部可以通过ClusterIP进行访问,外部用户可以通过NodeIP:NodePort的方式单独访问每个Node上的实例。
---
kind: Service
apiVersion: v1
metadata:
name: django
spec:
selector:
app: django
ports:
- port: 80
targetPort: 80
name: http
nodePort: 30080
type: NodePort
clusterIP: 10.96.117.231
3.4、LoadBalancer
利用公网负载均衡,转发流量到k8s。
LoadBalancer类型的service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。
---
kind: Service
apiVersion: v1
metadata:
name: django
spec:
selector:
app: django
ports:
- port: 80
targetPort: 80
name: http
nodePort: 30080
type: LoadBalancer
clusterIP: 10.96.117.231
3.5、ExternalName
将外部的服务接入集群,使用k8s来管理外部的服务。
ExternalName Service是Service的一个特例,它没有选择器,也没有定义任何端口或Endpoints。它的作用是返回集群外Service的外部别名。它将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将CNAME解析到了外部地址上),实现了集群内部访问即可。例如你们公司的镜像仓库,最开始是用ip访问,等到后面域名下来了再使用域名访问。你不可能去修改每处的引用。但是可以创建一个ExternalName,首先指向到ip,等后面再指向到域名。
---
kind: Service
apiVersion: v1
metadata:
name: externalname
spec:
type: ExternalName
externalName: www.baidu.com
3.6、Service别名
Service别名 跟 Service IP 同样的功能。
Service别名的组成:
service名称.命名空间.svc.cluster.local
django.default.svc.cluster.local
4、案例
4.1、数据库
---
kind: Namespace
apiVersion: v1
metadata:
name: mysql
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: mysql
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
readinessProbe:
tcpSocket:
port: 3306
---
kind: Service
apiVersion: v1
metadata:
name: mysql
namespace: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
[root@k8s-master-01 ~]# kubectl apply -f mysql.yaml
[root@k8s-master-01 ~]# kubectl exec -it -n mysql mysql-566544f8cc-8w6zz -- bash
root@mysql-566544f8cc-8w6zz:/# mysql -uroot -p123456
mysql> create database bbs CHARACTER SET utf8 COLLATE utf8_general_ci;;
Query OK, 1 row affected (0.00 sec)
4.2、BBS
---
kind: Namespace
apiVersion: v1
metadata:
name: bbs
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: bbs
namespace: bbs
spec:
selector:
matchLabels:
app: bbs
template:
metadata:
labels:
app: bbs
spec:
containers:
- name: bbs
image: alvinos/django:v1.3
readinessProbe:
tcpSocket:
port: 80
---
kind: Service
apiVersion: v1
metadata:
namespace: bbs
name: bbs
spec:
selector:
app: bbs
ports:
- port: 80
targetPort: 80
nodePort: 30081
type: NodePort
[root@k8s-master-01 k8s]# kubectl apply -f bbs.yaml