• 006.kubernets之Deployment简单部署


    一 Deployment相对于RC的优势

    RS与Deployment主要用于替代RC。RS的全称为Replica Set。相对于RC,RS与Deployment的优势如下:

    • RC只支持基于等式的selector,如env=dev或者environment!=qa。但在RS中,还支持新的基于集合的selector,如version in (v1.0,v2.0)或者env not in (dev,qa)。这给复杂的运维管理带来方便
    • 使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作。虽然使用kubectl rolling-update也可以完成滚动升级,但它是在客户端与服务端多次交互控制RC完成的,所以REST API中并没有rolling-update的接口,这为定制自己的管理系统带来了一些麻烦。Deployment拥有更加灵活的升级、回滚功能。

    Replica Set目前与RC的区别只是支持的selector不同,后续会加入更多的功能。Deployment使用了Replica Set,是更高一层的概念。除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用Replica Set。

    二 Deployment是简单使用

    2.1 同时安装三个nginx pod

    [root@docker-server1 manifests]# cd /yamls/

    [root@docker-server1 yamls]# mkdir deployment

    [root@docker-server1 yamls]# cd deployment

    [root@docker-server1 deployment]# vim nginx-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: hello-deployment
        namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: hello-deployment
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 10%
          maxUnavailable: 0
      template:
        metadata:
          labels:
            name: hello-deployment
        spec:
          containers:
          - name: webserver
            image: nginx:1.4
            ports:
            - containerPort: 80

    [root@docker-server1 deployment]# kubectl apply -f nginx-deployment.yaml

    2.2 查看

    [root@docker-server1 deployment]# kubectl get pods

    NAME                               READY   STATUS         RESTARTS   AGE
    goproxy                            1/1     Running        0          126m
    hello-deployment-c6fb6d858-9g5pq   0/1     ErrImagePull   0          11s
    hello-deployment-c6fb6d858-qnnld   0/1     ErrImagePull   0          11s
    hello-deployment-c6fb6d858-v549m   0/1     ErrImagePull   0          11s
    init-demo                          1/1     Running        0          68m
    nginx                              2/2     Running        4          4h13m
    nginx-volume                       1/1     Running        0          88m

     [root@docker-server1 deployment]# kubectl get pods -o wide

    NAME                               READY   STATUS             RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
    goproxy                            1/1     Running            0          126m    10.244.1.8    192.168.132.132   <none>           <none>
    hello-deployment-c6fb6d858-9g5pq   0/1     ImagePullBackOff   0          21s     10.244.2.11   192.168.132.133   <none>           <none>
    hello-deployment-c6fb6d858-qnnld   0/1     ImagePullBackOff   0          21s     10.244.1.12   192.168.132.132   <none>           <none>
    hello-deployment-c6fb6d858-v549m   0/1     ImagePullBackOff   0          21s     10.244.1.13   192.168.132.132   <none>           <none>
    init-demo                          1/1     Running            0          68m     10.244.1.10   192.168.132.132   <none>           <none>
    nginx                              2/2     Running            4          4h14m   10.244.2.10   192.168.132.133   <none>           <none>
    nginx-volume                       1/1     Running            0          89m     10.244.1.9    192.168.132.132   <none>           <none>

    [root@docker-server1 deployment]# kubectl describle pods  hello-deployment-c6fb6d858-v549m

    Events:
      Type     Reason     Age                    From                      Message
      ----     ------     ----                   ----                      -------
      Normal   Scheduled  <unknown>              default-scheduler         Successfully assigned default/hello-deployment-c6fb6d858-v549m to 192.168.132.132
      Normal   Pulling    4m36s (x4 over 6m20s)  kubelet, 192.168.132.132  Pulling image "nginx:1.4"
      Warning  Failed     4m32s (x4 over 6m12s)  kubelet, 192.168.132.132  Failed to pull image "nginx:1.4": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:1.4 not found: manifest unknown: manifest unknown
      Warning  Failed     4m32s (x4 over 6m12s)  kubelet, 192.168.132.132  Error: ErrImagePull
      Warning  Failed     4m8s (x7 over 6m11s)   kubelet, 192.168.132.132  Error: ImagePullBackOff
      Normal   BackOff    74s (x19 over 6m11s)   kubelet, 192.168.132.132  Back-off pulling image "nginx:1.4"

    是nginx:1.4没有这个镜像

    2.3 滚动更新

    修改为1.14版本,就会自己更新

    滚动更新策略

    1 先删后起

    2 先起后删

    [root@docker-server1 deployment]#  kubectl apply -f nginx-deployment.yaml 

    [root@docker-server1 deployment]# kubectl get pods -o wide

    hello-deployment-5fdb46d67c-jvvjr   0/1     ContainerCreating   0          4s      <none>        192.168.132.132   <none>           <none>
    hello-deployment-c6fb6d858-9g5pq    0/1     ImagePullBackOff    0          8m15s   10.244.2.11   192.168.132.133   <none>           <none>
    hello-deployment-c6fb6d858-qnnld    0/1     ImagePullBackOff    0          8m15s   10.244.1.12   192.168.132.132   <none>           <none>
    hello-deployment-c6fb6d858-v549m    0/1     ImagePullBackOff    0          8m15s   10.244.1.13   192.168.132.132   <none>           <none>

    [root@docker-server1 deployment]# kubectl get pods -o wide

    hello-deployment-5fdb46d67c-7ct2z   0/1     ContainerCreating   0          9s      <none>        192.168.132.133   <none>           <none>
    hello-deployment-5fdb46d67c-jvvjr   1/1     Running             0          34s     10.244.1.14   192.168.132.132   <none>           <none>
    hello-deployment-c6fb6d858-9g5pq    0/1     ImagePullBackOff    0          8m45s   10.244.2.11   192.168.132.133   <none>           <none>
    hello-deployment-c6fb6d858-qnnld    0/1     ImagePullBackOff    0          8m45s   10.244.1.12   192.168.132.132   <none>           <none>

    已经运行成功更新一个

    [root@docker-server1 deployment]# kubectl get pods -o wide

    hello-deployment-5fdb46d67c-7ct2z   1/1     Running   0          118s    10.244.2.12   192.168.132.133   <none>           <none>
    hello-deployment-5fdb46d67c-jvvjr   1/1     Running   0          2m23s   10.244.1.14   192.168.132.132   <none>           <none>
    hello-deployment-5fdb46d67c-qfjht   1/1     Running   0          90s     10.244.1.15   192.168.132.132   <none>           <none

    全部更新

    二 部署一个word press网站

    2.1 部署mysql

    [root@docker-server1 deployment]# vim mysql-deployment.yaml

    apiVersion:  apps/v1
    kind: Deployment
    metadata:
      name: mysql
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql 
        spec:
          containers:
            - name: mysql
              image: mysql:5.7
              ports:
                - containerPort: 3306
              env:
                - name: MYSQL_ROOT_PASSWORD
                  value: RedHat123
                - name: MYSQL_DATABASE
                  value: wordpress

    [root@docker-server1 deployment]# kubectl apply -f mysql-deployment.yaml 

    [root@docker-server1 deployment]# kubectl get pods

    mysql-5d4695cd5-kq9cl               0/1     ContainerCreating   0          8s

    [root@docker-server1 deployment]# yum -y install mysql

    [root@docker-server1 deployment]# kubectl get pods

    NAME                                READY   STATUS    RESTARTS   AGE
    goproxy                             1/1     Running   0          149m
    hello-deployment-5fdb46d67c-7ct2z   1/1     Running   0          15m
    hello-deployment-5fdb46d67c-jvvjr   1/1     Running   0          15m
    hello-deployment-5fdb46d67c-qfjht   1/1     Running   0          14m
    init-demo                           1/1     Running   0          92m
    mysql-5d4695cd5-kq9cl               1/1     Running   0          102s
    nginx                               2/2     Running   4          4h37m
    nginx-volume                        1/1     Running   0          112m

     [root@docker-server1 deployment]# kubectl get pods -o wide

    mysql-5d4695cd5-kq9cl               1/1     Running   0          3m22s   10.244.1.16   192.168.132.132

    [root@docker-server1 deployment]# mysql -uroot -pRedHat123 -h10.244.1.16

    2.2 部署wordpress

    [root@docker-server1 deployment]# vi wordpress-deployment.yaml 

    apiVersion:  apps/v1
    kind: Deployment
    metadata:
      name: wordpress
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: wordpress
      template:
        metadata:
          labels:
            app: wordpress 
        spec:
          nodeName: 192.168.1.233
          containers:
            - name: wordpress
              image: wordpress:5.3.2-php7.2-apache
              ports:
                - containerPort: 80
              env:
                - name: WORDPRESS_DB_PASSWORD
                  value: RedHat123
                - name: WORDPRESS_DB_NAME
                  value: wordpress
                - name: WORDPRESS_DB_HOST
                  value: 10.244.1.16
                - name: WORDPRESS_DB_USER
                  value: root

    [root@docker-server1 deployment]# kubectl apply -f wordpress-deployment.yaml 

    [root@docker-server1 deployment]# kubectl get pods -o wide

    NAME                         READY   STATUS              RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
    goproxy                      1/1     Running             0          164m    10.244.1.8    192.168.132.132   <none>           <none>
    init-demo                    1/1     Running             0          106m    10.244.1.10   192.168.132.132   <none>           <none>
    mysql-5d4695cd5-kq9cl        1/1     Running             0          16m     10.244.1.16   192.168.132.132   <none>           <none>
    nginx                        2/2     Running             4          4h51m   10.244.2.10   192.168.132.133   <none>           <none>
    nginx-volume                 1/1     Running             0          127m    10.244.1.9    192.168.132.132   <none>           <none>
    wordpress-86cbfc4456-zp985   0/1     ContainerCreating   0          2s      <none>        192.168.132.131   <none>           <none>

    [root@docker-server1 deployment]# kubectl describe pods wordpress-86cbfc4456-zp985

    Events:
      Type    Reason   Age   From                      Message
      ----    ------   ----  ----                      -------
      Normal  Pulling  3m5s  kubelet, 192.168.132.131  Pulling image "wordpress:5.3.2-php7.2-apache"
      Normal  Pulled   97s   kubelet, 192.168.132.131  Successfully pulled image "wordpress:5.3.2-php7.2-apache"
      Normal  Created  94s   kubelet, 192.168.132.131  Created container wordpress
      Normal  Started  94s   kubelet, 192.168.132.131  Started container wordpress

    [root@docker-server1 deployment]# kubectl get pods -o wide

    NAME                         READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
    goproxy                      1/1     Running   0          167m    10.244.1.8    192.168.132.132   <none>           <none>
    init-demo                    1/1     Running   0          109m    10.244.1.10   192.168.132.132   <none>           <none>
    mysql-5d4695cd5-kq9cl        1/1     Running   0          19m     10.244.1.16   192.168.132.132   <none>           <none>
    nginx                        2/2     Running   4          4h55m   10.244.2.10   192.168.132.133   <none>           <none>
    nginx-volume                 1/1     Running   0          130m    10.244.1.9    192.168.132.132   <none>           <none>
    wordpress-86cbfc4456-zp985   1/1     Running   0          3m9s    10.244.0.4    192.168.132.131   <none>           <none>

    2.3 service资源对象创建MySQL的转发

    负载均衡器对象,通过创建 service资源对象,会在ku即e- proxy上为这一类资源创建一个負载均衡器,并为其生成一个集群内部可访问的不变的VIP

    [root@docker-server1 deployment]# mkdir /yamls/svcs

    [root@docker-server1 deployment]# cd /yamls/svcs

    [root@docker-server1 svcs]# vi mysql-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
    spec:
      selector:        #匹配label
        app: mysql
      type: ClusterIP
      ports:
        - port: 3306    
          targetPort: 3306

    [root@docker-server1 svcs]# kubectl apply -f mysql-svc.yaml

    [root@docker-server1 svcs]# kubectl get svc

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    10h
    mysql-svc    ClusterIP   10.96.240.104   <none>        3306/TCP   18s

    [root@docker-server1 svcs]# cat mysql-svc.yam

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
    spec:
      selector:
        app: mysql
      type: ClusterIP
      clusterIP: 10.96.240.104
      ports:
        - port: 3306
          targetPort: 3306

    [root@docker-server1 svcs]# kubectl delete -f mysql-svc.yaml

    [root@docker-server1 svcs]# kubectl apply -f mysql-svc.yaml 

    [root@docker-server1 svcs]# kubectl get svc

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    10h
    mysql-svc    ClusterIP   10.96.240.104   <none>        3306/TCP   7s

    [root@docker-server1 svcs]# mysql -uroot -pRedHat123 -h10.96.240.104

    在这里连接很慢

    [root@docker-server1 deployment]# kubectl get svc --all-namespaces

    NAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
    default                kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP                  11h
    default                mysql-svc                   ClusterIP   10.96.240.104   <none>        3306/TCP                 9m37s
    kube-system            kube-dns                    ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   11h
    kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.93.119    <none>        8000/TCP                 10h
    kubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.87.98     <none>        443:32443/TCP            10h

    2.4 修改wordspress

    apiVersion:  apps/v1
    kind: Deployment
    metadata:
      name: wordpress
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: wordpress
      template:
        metadata:
          labels:
            app: wordpress
        spec:
          nodeName: 192.168.132.131
          containers:
            - name: wordpress
              image: wordpress:5.3.2-php7.2-apache
              ports:
                - containerPort: 80
              env:
                - name: WORDPRESS_DB_PASSWORD
                  value: RedHat123
                - name: WORDPRESS_DB_NAME
                  value: wordpress
                - name: WORDPRESS_DB_HOST
                  value: 10.96.240.104    #修改这个IP,为serviceIP
                - name: WORDPRESS_DB_USER
                  value: root

    2.5 外部访问wordpress

    [root@docker-server1 svcs]# vi wordpress-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress
    spec:
      selector:
        app: wordpress
      type: NodePort        #为node节点配置端口映射
      ports:
        - port: 80
          targetPort: 80
          nodePort: 32080

    [root@docker-server1 svcs]# kubectl apply -f wordpress-svc.yaml

    [root@docker-server1 svcs]# kubectl get svc

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        11h
    mysql-svc    ClusterIP   10.96.240.104   <none>        3306/TCP       16m
    wordpress    NodePort    10.96.72.115    <none>        80:32080/TCP   2s

    [root@docker-server1 svcs]# netstat -ntlp|grep 32080

    2.6 查看详细信息

    [root@docker-server1 ~]# kubectl describe  svc mysql-svc

    Name:              mysql-svc
    Namespace:         default
    Labels:            <none>
    Annotations:       <none>
    Selector:          app=mysql
    Type:              ClusterIP
    IP:                10.96.240.104
    Port:              <unset>  3306/TCP
    TargetPort:        3306/TCP
    Endpoints:         10.244.1.22:3306
    Session Affinity:  None
    Events:            <none>

    [root@docker-server1 ~]# kubectl describe  svc wordpress

    Name:                     wordpress
    Namespace:                default
    Labels:                   <none>
    Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                                {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"wordpress","namespace":"default"},"spec":{"ports":[{"nodePort":32...
    Selector:                 app=wordpress
    Type:                     NodePort
    IP:                       10.96.72.115
    Port:                     <unset>  80/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  32080/TCP
    Endpoints:                10.244.0.6:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>

    2.7 查看iptables

    [root@docker-server1 ~]# iptables -t nat -L|grep 32080

    KUBE-MARK-MASQ  tcp  --  anywhere             anywhere             /* default/wordpress: */ tcp dpt:32080
    KUBE-SVC-2T26TNVTRAU2MSW5  tcp  --  anywhere             anywhere             /* default/wordpress: */ tcp dpt:32080

    [root@docker-server1 ~]# iptables -t nat -L

    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.240.104        /* default/mysql-svc: cluster IP */ tcp dpt:mysql
    KUBE-SVC-USVAXDL4J4VMVCQU  tcp  --  anywhere             10.96.240.104        /* default/mysql-svc: cluster IP */ tcp dpt:mysql
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.72.115         /* default/wordpress: cluster IP */ tcp dpt:http
    KUBE-SVC-2T26TNVTRAU2MSW5  tcp  --  anywhere             10.96.72.115         /* default/wordpress: cluster IP */ tcp dpt:http
    KUBE-MARK-MASQ  udp  -- !docker-server1/16    10.96.0.10           /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
    KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  anywhere             10.96.0.10           /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.0.10           /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
    KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  anywhere             10.96.0.10           /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.0.10           /* kube-system/kube-dns:metrics cluster IP */ tcp dpt:9153
    KUBE-SVC-JD5MR3NA4I4DYORP  tcp  --  anywhere             10.96.0.10           /* kube-system/kube-dns:metrics cluster IP */ tcp dpt:9153
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.93.119         /* kubernetes-dashboard/dashboard-metrics-scraper: cluster IP */ tcp dpt:irdmi
    KUBE-SVC-NDSMHFCKXJRPU4FV  tcp  --  anywhere             10.96.93.119         /* kubernetes-dashboard/dashboard-metrics-scraper: cluster IP */ tcp dpt:irdmi
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.87.98          /* kubernetes-dashboard/kubernetes-dashboard: cluster IP */ tcp dpt:https
    KUBE-SVC-4CRUJHTV5RT5YMFY  tcp  --  anywhere             10.96.87.98          /* kubernetes-dashboard/kubernetes-dashboard: cluster IP */ tcp dpt:https
    KUBE-MARK-MASQ  tcp  -- !docker-server1/16    10.96.0.1            /* default/kubernetes:https cluster IP */ tcp dpt:https 

    2.8 外部配置wordpress

    访问:http://192.168.132.131:32080

     选择简体中文

    配置邮件

     登录

     

     输入用户名密码

     

    最终界面

    配置完成


    博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

  • 相关阅读:
    【C语言入门教程】5.6 函数库和文件
    【C语言入门教程】5.5 实现问题(效率)
    【C语言入门教程】5.4 递归
    【C语言入门教程】5.3 函数的调用 与 参数
    【C语言入门教程】5.2 函数的作用域规则(auto, static)
    bootstrap之双日历时间段选择控件示例—daterangepicker(中文汉化版)
    PHP导出数据到CSV文件函数 csv_export()
    MySQL 5.6 Warning: Using a password on the command line interface can be insecure
    【定时任务|开机启动】Windows Server 2008/2012 计划任务配置(任务计划程序)每分钟执行BAT
    【风雪之隅】写在PHP7发布之际一些话 2015-12-02
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/12183444.html
Copyright © 2020-2023  润新知