1、创建私有仓库
代码语言:javascript复制[root@docker-k8s01 ~]# docker run -itd --name registry -p 5000:5000 --restart always registry:latest
#在所有需要使用私有仓库的docker主机上添加如下配置
[root@docker-k8s01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.171.151:5000
#修改完文件后重启使之生效
[root@docker-k8s01 ~]# systemctl daemon-reload
[root@docker-k8s01 ~]# systemctl restart docker
2、在master节点,自定义一个镜像,基于nginx镜像,默认界面内容改为:Version:v1,版本2内容为:Version:v2.版本3内容为:Version:v3
代码语言:javascript复制#编写dockerfile文件
[root@docker-k8s01 ~]# vim Dockerfile
FROM nginx
ADD index.html /usr/share/nginx/html
#编辑v1版本的首页内容
[root@docker-k8s01 ~]# echo "Version:v1" > index.html
#制作v1版本的镜像
[root@docker-k8s01 ~]# docker build -t 192.168.171.151:5000/zyz:v1 .
#制作v2版本的镜像
[root@docker-k8s01 ~]# echo "Version:v2" > index.html
[root@docker-k8s01 ~]# docker build -t 192.168.171.151:5000/zyz:v2 .
#制作v3版本的镜像
[root@docker-k8s01 ~]# echo "Version:v3" > index.html
[root@docker-k8s01 ~]# docker build -t 192.168.171.151:5000/zyz:v3 .
#将制作好的三个版本的镜像上传至私有仓库
[root@docker-k8s01 ~]# docker push 192.168.171.151:5000/zyz:v1
[root@docker-k8s01 ~]# docker push 192.168.171.151:5000/zyz:v2
[root@docker-k8s01 ~]# docker push 192.168.171.151:5000/zyz:v3
创建一个Namespace.接下来的所有操作都在此名称空间之下
代码语言:javascript复制[root@docker-k8s01 ~]# mkdir test
[root@docker-k8s01 ~]# cd test/
[root@docker-k8s01 test]# vim ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: zyz
[root@docker-k8s01 test]# kubectl apply -f ns.yaml # 运行yaml文件
namespace/zyz created
[root@docker-k8s01 test]# kubectl get ns zyz # 查看创建的namespace
NAME STATUS AGE
zyz Active 30s
创建一个Deployment资源对象,镜像版本为v1
代码语言:javascript复制[root@docker-k8s01 test]# vim zyz.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zyz
namespace: zyz
spec:
revisionHistoryLimit: 5 # 规定记录多少个版本,这个字段通过 kubectl explain deploy.spec 命令找到revisionHistoryLimit <integer>行获得
replicas: 2
template:
metadata:
labels:
name: zyz
spec:
containers:
- name: zyz
image: 192.168.171.151:5000/zyz:v1 # 镜像版本为1
ports:
- containerPort: 80
#执行该yaml文件, --record表示记录版本历史
[root@docker-k8s01 test]# kubectl apply -f zyz.yaml --record
[root@docker-k8s01 test]# kubectl get pod # 查看上面yaml文件运行的pod
No resources found.
#可以得出结论,如果在编写yaml文件时,指定了归属于哪个namespace,
#那么执行上面的命令是查看不到运行的pod的,而不是没有运行的pod
[root@docker-k8s01 test]# kubectl get pod -n zyz # 增加“-n”选项,指定名称空间,即可看对应的pod
NAME READY STATUS RESTARTS AGE
zyz-5d7cb64655-9pdcj 1/1 Running 0 98s
zyz-5d7cb64655-zzqcv 1/1 Running 0 98s
#查看zyz的namespace名称空间的名为zyz的deployment资源对象
[root@docker-k8s01 test]# kubectl rollout history deployment -n zyz zyz
deployment.extensions/zyz
REVISION CHANGE-CAUSE
1 kubectl apply --filename=zyz.yaml --record=true
#可以看到当前只有一个版本,也可以看到filename(文件名称)
创建一个Service资源对象,关联到上面的Deployment资源对象
代码语言:javascript复制[root@docker-k8s01 test]# vim zyz-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: zyz-service
namespace: zyz
spec:
type: NodePort
selector:
name: zyz
ports:
- name: zyz-port
port: 8080 # service的IP接口
targetPort: 80 # pod的端口
nodePort: 31111 # 映射到宿主机的端口
[root@docker-k8s01 test]# kubectl apply -f zyz-svc.yaml
[root@docker-k8s01 test]# kubectl get svc # 若不指定名称空间,是查不到对应的service的
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
[root@docker-k8s01 test]# kubectl get svc -n zyz # 使用“-n”选项查看指定的名称空间中的service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zyz-service NodePort 10.100.89.145 <none> 8080:31111/TCP 55s
注意:创建的service资源对象必须和创建的deployment资源对象在同一个namespace中,否则无法进行关联!!!
客户端访问k8s群集中的任意一个节点的31111端口访问其pod提供的服务
如果需要在线修改pod提供的网页文件,可以先查看到pod的name,然后直接在主节点上登录到此pod即可,命令如下
代码语言:javascript复制[root@docker-k8s01 httpd-web]# kubectl get pod -o wide #查看pod的name
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-devploy1-6f987c9764-5g92w 1/1 Running 0 8m35s 10.244.1.5 node01 <none> <none>
httpd-devploy1-6f987c9764-wvgft 1/1 Running 0
[root@docker-k8s01 httpd-web]# kubectl exec -it httpd-devploy1-6f987c9764-5g92w /bin/bash #通过指定pod的name,进入pod
现在由1版本,滚动更新至2版本、再到3版本,最后回滚到指定1版本内容
代码语言:javascript复制[root@docker-k8s01 test]# sed -i 's/zyz:v1/zyz:v2/' zyz.yaml # 更新为版本2
[root@docker-k8s01 test]# kubectl apply -f zyz.yaml # 执行
deployment.extensions/zyz configured # 配置成功
#访问验证
[root@docker-k8s01 test]# curl 192.168.171.151:31111
Version:v2
#查看历史版本
[root@docker-k8s01 test]# kubectl rollout history deployment -n zyz zyz
deployment.extensions/zyz
REVISION CHANGE-CAUSE
1 kubectl apply --filename=zyz.yaml --record=true
2 <none>
#现在是有两个历史版本了
#接下来再次升级并验证
[root@docker-k8s01 test]# sed -i 's/zyz:v2/zyz:v3/' zyz.yaml
[root@docker-k8s01 test]# kubectl apply -f zyz.yaml
deployment.extensions/zyz configured
#再次访问可以看到现在是版本3了
[root@docker-k8s01 test]# curl 192.168.171.151:31111
Version:v3
#查看历史版本信息
[root@docker-k8s01 test]# kubectl rollout history deployment -n zyz zyz
deployment.extensions/zyz
REVISION CHANGE-CAUSE
1 kubectl apply --filename=zyz.yaml --record=true
2 <none>
3 <none>
#接下来执行回滚操作
#回滚到版本1,需要指定namespace,“--to-revision”是指定回滚到哪个版本
[root@docker-k8s01 test]# kubectl rollout undo deployment -n zyz zyz --to-revision=1
deployment.extensions/zyz rolled back
[root@docker-k8s01 test]# curl 192.168.171.151:31111
Version:v1
[root@docker-k8s01 test]# kubectl rollout history deployment -n zyz zyz
#再次查看历史记录,发现版本1变成了版本4,之前的1已经没有了
deployment.extensions/zyz
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 kubectl apply --filename=zyz.yaml --record=true