k8s之pod管理

Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。

一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。

参考地址:pod命令行管理

一、创建和删除pod应用

实验环境:
server1作为本地仓库,server2作为master,server3,server4作为node节点
实验前要保证保证仓库正常运行

[root@server1 harbor]# docker-compose ps

k8s之pod管理_第1张图片
节点状态ready

[root@server2 ~]# kubectl get nod

在这里插入图片描述
k8s之pod管理_第2张图片

1 创建pod

此时要保证你所使用的镜像myapp,在本地仓库存在才行。

[root@server2 ~]# kubectl  run nginx --image=myapp:v1
[root@server2 ~]# kubectl get pod

当出现下图状态时说明创建成功。
k8s之pod管理_第3张图片

2 查看pod运行在哪个节点上,且查看分配的ip地址

[root@server2 ~]# kubectl get pod -o wide

在这里插入图片描述

3 访问分配的ip

集群内部任意节点可以访问Pod,但集群外部无法直接访问。

[root@server2 ~]# curl 10.244.2.21

在这里插入图片描述
测试:
这时我们再创建一个pod,到容器内进行访问

[root@server2 ~]# kubectl run demo --image=busyboxplus -it
If you don't see a command prompt, try pressing enter.
/ # ip addr

k8s之pod管理_第4张图片

[root@server2 ~]# kubectl get pod -o wide

这时我们发现容器内的ip和容器外的ip相同
k8s之pod管理_第5张图片
再次进入容器我们访问刚才myapp的ip,查看结果

[root@server2 ~]# kubectl attach demo  -i -t
/ # curl 10.244.2.21

k8s之pod管理_第6张图片

4 删除pod

删除pod的命令

[root@server2 ~]# kubectl delete pod nginx

使用下面命令可以查看正在运行的pod的详细信息

[root@server2 ~]# kubectl describe pod demo 

k8s之pod管理_第7张图片

5.查看日志的命令

[root@server2 ~]# kubectl logs demo

6 通过控制器创建pod

一般我们不会使用刚才演示的那种单独创建的方式

[root@server2 ~]# kubectl create deployment nginx --image=myapp:v1
[root@server2 ~]# kubectl get all

k8s之pod管理_第8张图片

这里如果我们进行删除的话,它是不会直接被删除的,他会删除之后,自动重新创建出来一个新的副本。只是随机id发生变化

二、Pod扩容与缩容

[root@server2 ~]# kubectl scale deployment --replicas=2 nginx
[root@server2 ~]# kubectl get pod -o wide

k8s之pod管理_第9张图片

三、 service(微服务)

service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。

1.创建service

[root@server2 ~]# kubectl expose deployment nginx --port=80
[root@server2 ~]# kubectl get svc
[root@server2 ~]# curl 10.100.138.138

此时pod客户端可以通过service的名称访问后端的两个Pod
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
k8s之pod管理_第10张图片
在这里插入图片描述
在这里插入图片描述

2 查看svc详细信息

[root@server2 ~]# kubectl describe svc nginx

这里的ip对应pod的副本ip
k8s之pod管理_第11张图片
会根据副本数自动实现副本负载均衡

3.修改暴露类型

NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务

[root@server2 ~]# kubectl edit svc nginx

将类型改成NodePort
k8s之pod管理_第12张图片

[root@server2 ~]# kubectl get svc 

在这里插入图片描述
在外部访问时,用的是节点ip+端口访问

[root@Sun_s Desktop]# curl 172.25.1.2:30224/hostname.html

k8s之pod管理_第13张图片

4 更新及回滚pod镜像

[root@server2 ~]# kubectl set image deployment nginx myapp=myapp:v2 --record    #更新
[root@server2 ~]# kubectl rollout undo deployment nginx --to-revision=1   #回滚
[root@server2 ~]# kubectl rollout history deployment nginx	//查看历史版本
[root@server2 ~]# curl 10.100.138.138

k8s之pod管理_第14张图片

四、资源清单

1.清单格式

清单格式
apiVersion: group/version  //指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions //查询命令
kind: //标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: //元数据
name: //对像名称
namespace: //对象属于哪个命名空间
labels: //指定资源标签,标签是一种键值数据
spec: //定义目标资源的期望状态

2. 参数信息

k8s之pod管理_第15张图片
k8s之pod管理_第16张图片
k8s之pod管理_第17张图片
k8s之pod管理_第18张图片
k8s之pod管理_第19张图片

3 查看帮助

[root@server2 ~]# kubectl api-versions    ## 查看所有api的版本信息
[root@server2 ~]# kubectl explain pod.spec.containers   ## pod清单帮助  一层一层看

k8s之pod管理_第20张图片

4 删除之前创建的

[root@server2 ~]# kubectl delete deployments.apps nginx  
[root@server2 ~]# kubectl delete svc nginx

5 编写创建pod 的api文件

[root@server2 ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
spec:
  containers:
  - name: nginx
    image: myapp:v1
    imagePullPolicy: IfNotPresent
[root@server2 ~]# kubectl apply -f pod.yml
[root@server2 ~]# kubectl get pod

k8s之pod管理_第21张图片

6 删除

[root@server2 ~]# kubectl delete -f pod.yml

在这里插入图片描述

7.编写创建deployment api文件

[root@server2 ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod

k8s之pod管理_第22张图片

8.将运行中的pod转换成yml格式

[root@server2 ~]# kubectl get pod nginx-b5548c7c4-4phr9 -o yaml

k8s之pod管理_第23张图片

9 优化

[root@server2 ~]# vim deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      #nodeSelector:
      #  kubernetes.io/hostname: server4 
      nodeName: server3  #增加标签选择器
      #hostNetwork: true  #使用主机网络,注意端口不能冲突
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m  #最小限制;十分之一cpu资源,也可以写成0.1
            memory: 70Mi
          limits:  #上限,超出被控制器杀死
            cpu: 0.5
            memory: 512Mi
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod -o wide
[root@server2 ~]# kubectl describe pod 

全部在server3节点上
在这里插入图片描述
k8s之pod管理_第24张图片

10.自主式Pod资源清单

在之前的基础上再加一个容器进来

      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m  #最小限制;十分之一cpu资源,也可以写成0.1
            memory: 70Mi
          limits:  #上限,超出被控制器杀死
            cpu: 0.5
            memory: 512Mi
      - name: busyboxplus
        image: busyboxplus
        imagePullPolicy: IfNotPresent
        stdin: true
        tty: true
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod

这时我们看到有两个容器
k8s之pod管理_第25张图片
运行的时候使用-c 指定容器

[root@server2 ~]# kubectl attach nginx-585f596658-gcd89 -c busyboxplus -it
If you don't see a command prompt, try pressing enter.
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

11.标签

主要在控制器中使用,可以在节点上或pod打标签

[root@server2 ~]# kubectl get pod --show-labels   #查看标签
[root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v1   ## 打标签
[root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v2 --overwrite  ##更改标签
[root@server2 ~]# kubectl get pod -l version  ##过滤标签

k8s之pod管理_第26张图片
k8s之pod管理_第27张图片
节点标签选择器

$ kubectl label nodes server2 disktype=ssd
node/server2 labeled
$ kubectl get nodes -l disktype
NAME      STATUS   ROLES    AGE   VERSION
server2   Ready    <none>   6d    v1.17.2

在yaml文件中增加标签选择器

nodeSelector:
  disktype: ssd

五、pod的生命周期

k8s之pod管理_第28张图片
参考网站:kubernetes官网
k8s之pod管理_第29张图片
(1)Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。

(2)Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。

(3)如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

Init 容器能做什么?

Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

你可能感兴趣的:(k8s,docker,kubernetes,pod)