1、创建私有仓库

[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

#编写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.接下来的所有操作都在此名称空间之下

[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

[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资源对象

[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提供的服务
K8S的名称空间创建&&版本的升级、回滚操作
如果需要在线修改pod提供的网页文件,可以先查看到pod的name,然后直接在主节点上登录到此pod即可,命令如下

[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版本内容

[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