文章目录
- 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服务器使用一个持久化存储卷来在容器中共享存储。
网络:每一个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
示例:
在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
这时发现状态为等待状态
失败的状态的原因是因为命令启动冲突,启动完成后就将资源释放掉了,查看日志可以知道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的安装和私有仓库部署方式参考之前的博客)
2.创建一个test项目
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登录
5.下载httpd镜像进行推送
[root@node01 ~]# docker pull httpd ##node01从共有仓库下载httpd镜像
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
上传成功
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,控制器资源信息
8.这时打开浏览器可以正常访问tomcat页面
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私有仓库
[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
[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
这时打开浏览器访问私有仓库页面