文章目录

  • Pod概述
  • pod容器的分类
  • 一.infrastructure container 基础容器
  • 二.initcontainers 初始化容器
  • 三.container 业务容器
  • 镜像拉取策略(image PullPolicy)
  • 部署harbor创建私有项目


Pod概述

●在Kubernetes集群中,Pod是所有业务类型的基础,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。Kubernetes不只是支持Docker容器,它也支持其他容器。Pod 的上下文可以理解成多个linux命名空间的联合:

  • PID 命名空间(同一个Pod中应用可以看到其它进程)
  • 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限)
  • IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信)
  • UTS 命名空间(同一个Pod中的应用共享一个主机名称)

●一个Pod的共享上下文是Linux命名空间、cgroups和其它潜在隔离内容的集合。 在Pod中,容器共享一个IP地址和端口空间,它们可以通过localhost发现彼此。在同一个Pod中的容器,可以使用System V 或POSIX信号进行标准的进程间通信和共享内存。在不同Pod中的容器,拥有不同的IP地址,因此不能够直接在进程间进行通信。容器间通常使用Pod IP地址进行通信。在一个Pod中的应用于口访问共享的存储卷,它被定为为Pod的一部分,可以被挂接至每一个应用文件系统。与独立的应用容器一样,Pod是一个临时的实体,它有着自己的生命周期。在Pod被创建时,会被指派一个唯一的ID,并被调度到Node中,直到Pod被终止或删除。如果Pod所在的Node宕机,给定的Pod(即通过UID定义)不会被重新调度。相反,它将被完全相同的Pod所替代。这所说的具有和Pod相关生命周期的情况,例如存储卷,是说和Pod存在的时间一样长。如果Pod被删除,即使完全相同的副本被创建,则相关存储卷等也会被删除,并会Pod创建一个新的存储卷等。Pod本身就没有打算作为持久化的实体,在调度失败、Node失败和获取其它退出(缺少资源或者Node在维护)情况下,Pod都会被删除。一般来说,用户不应该直接创建Pod,即是创建单个的Pod也应该通过控制器创建。在集群范围内,控制器为Pod提供自愈能力,以及副本和部署管理。

一个多容器的Pod会包含一个文件拉取器和一个web服务器,此web服务器使用一个持久化存储卷来在容器中共享存储。

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_kubernetes

网络:每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口。在同一个Pod中的容器可以同locahost进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。

存储:Pod能够被指定共享存储卷的集合,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享数据。存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启。

特点

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

pod容器的分类

一.infrastructure container 基础容器

●作用:维护整个Pod网络空间;在k8s集群当中,只要创建Pod就会创建与Pod对应的基本容器,对于用户是透明的
1.在node节点上操作(这边举例node01)

[root@node01 ~]# cat /opt/kubernetes/cfg/kubelet      ##查看kubelet配置文件
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"     ##基础容器

2.在node节点中查看容器状态也可以看到基础容器,和pod是对应创建的(只要是在k8s集群当中),创建一个pod就会有一个基础容器;用户访问是感觉不到的

[root@master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=2     ##master节点创建nginx的pod资源,副本数量为2个

[root@master ~]# kubectl get pods -o wide   ##查看服务对应的node节点
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE
nginx-deployment-5477945587-6qcwv   1/1     Running   0          7m35s   172.17.64.3   192.168.148.140   <none>    ##一个在node01节点上
nginx-deployment-5477945587-wx5r5   1/1     Running   0          7m35s   172.17.57.2   192.168.148.139   <none>    ##一个在node02节点上

[root@node01 ~]# docker ps -a        ##查看node01容器状态
CONTAINER ID        IMAGE                                                                 COMMAND                  CREATED             STATUS              PORTS               NAMES
85fd60533366        nginx                                                                 "/docker-entrypoint.…"   23 seconds ago      Up 22 seconds                           k8s_nginx-deployment_nginx-deployment-5477945587-wx5r5_default_9ab284e3-0c69-11eb-bad0-000c29b67cec_0
b5fff649eecd        registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"                 50 seconds ago      Up 49 seconds                           k8s_POD_nginx-deployment-5477945587-wx5r5_default_9ab284e3-0c69-11eb-bad0-000c29b67cec_0

Node02:

[root@node02 ~]# docker ps -a     ##查看node02容器状态
CONTAINER ID        IMAGE                                                                 COMMAND                  CREATED             STATUS                  PORTS               NAMES
386d21ff2d95        nginx                                                                 "/docker-entrypoint.…"   11 minutes ago      Up 11 minutes                               k8s_nginx-deployment_nginx-deployment-5477945587-6qcwv_default_9ab530a2-0c69-11eb-bad0-000c29b67cec_0
e55809e746fb        registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"                 11 minutes ago      Up 11 minutes                               k8s_POD_nginx-deployment-5477945587-6qcwv_default_9ab530a2-0c69-11eb-bad0-000c29b67cec_0

二.initcontainers 初始化容器

1.先于业务容器开始执行,原先Pod中容器是并行开启,现在进行了改进

2.创建业务容器之前先定义初始化容器

三.container 业务容器

官方网站

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

本示例定义了一个具有两个init容器的简单Pod。第一个等待myservice,第二个等待mydb。一旦两个初始化容器都完成,则Pod将从其spec部分运行app容器。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:    ##属性
  containers:    ##定义业务容器
  - name: myapp-container     ##业务容器名字
    image: busybox:1.28     ##依赖于的镜像
command: ['sh', '-c', 'echo The app is running! && sleep 3600']  ##启动容器所需的指令
Sh:shell环境;   -c:command指令 echo:输出   sleep 3600:休眠3600秒
  initContainers:     ##初始化容器
  - name: init-myservice     ##名称
    image: busybox:1.28    ##镜像
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]    ####启动容器所需的指令
  - name: init-mydb
    image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

●初始化容器可以理解为:假设要装一个LAMP架构;apache(myservice)和mysql服务(mydb)就相当于初始化容器(要先部署);PHP就好比是业务容器(app)依赖于apache和mysql之后去部署

镜像拉取策略(image PullPolicy)

  • IfNotPresent:默认值,宿主机不存在情况下会去官网上下载
  • Always:每次创建Pod都会从镜像仓库重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像

镜像官网地址:

https://kubernetes.io/docs/concepts/containers/images

示例:

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_docker_02


在master01上操作

[root@master ~]# kubectl get pods    ##查看pod资源信息
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5477945587-dvz87   1/1     Running   0          24s
nginx-deployment-5477945587-ngnn7   1/1     Running   0          24s
nginx-deployment-5477945587-zlnvz   1/1     Running   0          24s
[root@master ~]# kubectl edit deploy/nginx-deployment     ##编辑控制器nginx镜像资源
....
    spec:
      containers:     ##容器属性中
      - image: nginx
        imagePullPolicy: Always    ##每次创建pod都是always
        name: nginx-deployment
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

1.创建always资源

[root@master ~]# cd demo/
[root@master demo]# vim pod1.yaml    ##创建pod1的yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: nginx
      image: nginx
      imagePullPolicy: Always
      command: [ "echo", "SUCCESS" ]
[root@master demo]#  kubectl create -f pod1.yaml     ##依据yaml文件创建资源
pod/mypod created

这时发现状态为等待状态

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_kubernetes_03


失败的状态的原因是因为命令启动冲突,启动完成后就将资源释放掉了,查看日志可以知道command: [ “echo”, “SUCCESS” ]是否被正确执行

[root@master demo]# kubectl logs mypod     ##查看资源的日志信息
SUCCESS     ##执行成功

2.删除command: [ “echo”, “SUCCESS” ],同时更改版本image: nginx:1.14

[root@master demo]# kubectl delete -f pod1.yaml    ##删除pod1资源
pod "mypod" deleted
[root@master demo]# vim pod1.yaml    ##修改yaml文件
containers:
    - name: nginx
      image: nginx:1.14    ##镜像版本改为1.14
[root@master demo]# kubectl apply -f pod1.yaml     ##更新资源
[root@master demo]# kubectl get pods -o wide    ##查看信息
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE
mypod                               1/1     Running   0          32s   172.17.57.4   192.168.148.139   <none>    ##状态为running状态,并且创建在node01节点上

3.在任意node节点使用curl 查看头部信息

[root@node01 ~]# curl -I 172.17.57.4    ##在node01上操作,查看信息
HTTP/1.1 200 OK
Server: nginx/1.14.2     ##版本号也修改了
.......

更新信息最好用yaml文件格式去更新最好,不会影响业务节点

部署harbor创建私有项目

1.打开新的节点部署私有仓库(docker的安装和私有仓库部署方式参考之前的博客)

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_Pod_04


2.创建一个test项目

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_Pod_05


3.node节点配置连接私有仓库(注意后面的逗号要添加)

[root@node01 ~]# cd /etc/docker/
[root@node01 docker]# vim daemon.json     ##修改node01上的daemon.json文件
{
  "registry-mirrors": ["https://iadhmcld.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.148.134"]     ##添加连接私有仓库的地址
}
[root@node01 docker]# systemctl restart docker    ##重启服务
同理修改node02的daemon.json文件(这边不举例了)

4.登录harbor私有仓库

[root@node01 docker]# docker login 192.168.148.134 ##node01登录

Node02登录

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_Pod_06


5.下载httpd镜像进行推送

[root@node01 ~]# docker pull httpd     ##node01从共有仓库下载httpd镜像

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_docker_07


6.推送镜像

[root@node01 ~]# docker tag httpd 192.168.148.134/test/httpd     ##将镜像打上标签
[root@node01 ~]# docker push 192.168.148.134/test/httpd      ##推送到私有仓库
The push refers to repository [192.168.148.134/test/httpd]
9f3f3dd7b0c2: Pushed 
51eabf53c0c9: Pushed 
6ce7826117a0: Pushed 
d37da03a9458: Pushed 
07cab4339852: Pushed 
latest: digest: sha256:ee876fb8588d58d25eb95840c5d81d211f0ebf238c7c10cbaea10861f6a027db size: 1366  
上传成功

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_nginx_08


7.node节点都下载tomcat镜像(这边举例node02),便于资源的快速创建

[root@node02 ~]# docker pull tomcat:8.0.52      ##版本为8.0.52版本
8.0.52: Pulling from library/tomcat
1c7fe136a31e: Pull complete 
ece825d3308b: Pull complete 
122a54f77455: Pull complete 
b0f58081abfa: Pull complete 
d87948ea8b09: Pull complete 
25934b035c41: Pull complete 
c19ad0b452cb: Pull complete 
97b2cf7bf1a2: Pull complete 
5a118107a2f9: Pull complete 
bf2397e2ae9f: Pull complete 
4378950c2263: Pull complete 
Digest: sha256:32d451f50c0f9e46011091adb3a726e24512002df66aaeecc3c3fd4ba6981bd4
Status: Downloaded newer image for tomcat:8.0.52
docker.io/library/tomcat:8.0.52

切换到master节点上配置

[root@master ~]# cd demo/
[root@master demo]# vim tomcat-deployment.yaml     ##编写tomcat的yaml文件
##资源创建
apiVersion: extensions/v1beta1
kind: Deployment    ##无状态化
metadata:
  name: my-tomcat
spec:
  replicas: 2    ##2个副本
  template:
    metadata:
      labels:
        app: my-tomcat
    spec:
      containers:
      - name: my-tomcat
        image: docker.io/tomcat:8.0.52    ##用docker.io的方式创建
        ports:
        - containerPort: 80    ##容器端口
---
##service资源创建
apiVersion: v1
kind: Service
metadata:
  name: my-tomcat
spec:
  type: NodePort    ##端口类型为nodeport 
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 31111    ##nodeport端口为31111
  selector:
    app: my-tomcat
[root@master demo]# kubectl create -f tomcat-deployment.yaml    ##创建tomcatpod资源
deployment.extensions/my-tomcat created
service/my-tomcat created
[root@master demo]# kubectl get pods,svc,deploy    ##查看pod,service,控制器资源信息

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_kubernetes_09


8.这时打开浏览器可以正常访问tomcat页面

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_nginx_10


9.node01上操作

[root@node01 ~]# docker tag tomcat:8.0.52 192.168.148.134/test/tomcat    ##将tomcat镜像打上标签
[root@node01 ~]# docker push 192.168.148.134/test/tomcat    ##上传到harbor私有仓库

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_docker_11

[root@node01 ~]# cat .docker/config.json | base64 -w 0    ##在node节点查看登陆凭据
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE0OC4xMzQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuMTMgKGxpbnV4KSIKCX0KfQ==   ##序列码,两个节点都是一样的
[root@master demo]# vim registry-pull-secret.yaml   ##编写yaml格式的安全凭证资源
apiVersion: v1   版本
kind: Secret
metadata:
  name: registry-pull-secret
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE0OC4xMzQiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuMTMgKGxpbnV4KSIKCX0KfQ==
type: kubernetes.io/dockerconfigjson   ##来自于k8s的json

[root@master demo]# kubectl create -f registry-pull-secret.yaml   ##创建安全凭证资源
secret/registry-pull-secret created
[root@master demo]# kubectl get secret   ##查看创建凭证资源
NAME                   TYPE                                  DATA   AGE
default-token-szxtd    kubernetes.io/service-account-token   3      4d12h
registry-pull-secret   kubernetes.io/dockerconfigjson        1      40s
[root@master demo]# kubectl delete -f tomcat-deployment.yaml    ##将原先的tomcat的资源删除
deployment.extensions "my-tomcat" deleted
service "my-tomcat" deleted

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_docker_12

[root@master demo]# vim tomcat-deployment.yaml      ##修改tomcat资源文件 
 ........  
 spec:    ##属性列修改
      imagePullSecrets:    ##添加镜像下载凭证
      - name: registry-pull-secret    ##凭证的名称
      containers:
      - name: my-tomcat
        image: 192.168.148.134/test/tomcat    ##镜像下载方式改为从私有仓库下载
[root@master demo]# kubectl create -f tomcat-deployment.yaml    ##重新创建tomcat资源
deployment.extensions/my-tomcat created
service/my-tomcat created

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_docker_13


这时打开浏览器访问私有仓库页面

k8s node节点拉取镜像后 docker images无镜像数据 k8s拉取镜像策略_nginx_14