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 
posted @ 2022-01-07 11:59  迪迦张  阅读(734)  评论(2编辑  收藏  举报