• 2、二进制部署kubernetes集群(下篇)


    1.k8S核心资源管理方法

    1.1.陈述式资源管理方法

    1.1.1.管理名称空间资源

    1.1.1.1.查看名称空间

    [root@hdss7-21 ~]# kubectl get namespace
    NAME              STATUS   AGE
    default           Active   6d12h
    kube-node-lease   Active   6d12h
    kube-public       Active   6d12h
    kube-system       Active   6d12h
    
    [root@hdss7-21 ~]# kubectl get ns
    NAME              STATUS   AGE
    default           Active   6d12h
    kube-node-lease   Active   6d12h
    kube-public       Active   6d12h
    kube-system       Active   6d12h
    
    

    1.1.1.2.查看名称空间内的资源

    [root@hdss7-21 ~]# kubectl get all -n default               
    //查询default名称空间下所有的资源,默认直接 kubectl get all 和 -n default 同等作用
    NAME                 READY   STATUS    RESTARTS   AGE            //pod资源
    pod/nginx-ds-mcvxt   1/1     Running   1          6d13h
    pod/nginx-ds-zsnz9   1/1     Running   1          6d13h
    
    
    NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE       //service资源
    service/kubernetes   ClusterIP   192.168.0.1   <none>        443/TCP   6d12h
    
    NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE                                                                 //pod控制器资源
    daemonset.apps/nginx-ds   2         2         2       2            2           <none>          6d5h
    

    1.1.1.3.创建名称空间

    [root@hdss7-21 ~]# kubectl create namespace app           //namespace 可以简写为ns
    namespace/app created
    [root@hdss7-21 ~]# kubectl  get namespace
    NAME              STATUS   AGE
    app               Active   13s
    default           Active   6d13h
    kube-node-lease   Active   6d13h
    kube-public       Active   6d13h
    kube-system       Active   6d13h
    

    1.1.1.4.删除名称空间

    [root@hdss7-21 ~]# kubectl delete namespace app
    namespace "app" deleted
    [root@hdss7-21 ~]# kubectl  get namespace
    NAME              STATUS   AGE
    default           Active   6d13h
    kube-node-lease   Active   6d13h
    kube-public       Active   6d13h
    kube-system       Active   6d13h
    

    1.1.2.管理Deployment资源

    1.1.2.1.创建Deployment

    [root@hdss7-21 ~]# kubectl  create deployment nginx-dp --image=harbor.od.com/public/nginx:v1.7.9 -n kube-public
    
    deployment.apps/nginx-dp created
    

    1.1.2.2.查看Deployment

    简单查看

    [root@hdss7-21 ~]# kubectl  get deployment -n kube-public
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-dp   1/1     1            1           64s
    

    扩展查看

    [root@hdss7-21 ~]# kubectl get pods -n kube-public
    NAME                        READY   STATUS    RESTARTS   AGE
    nginx-dp-5dfc689474-v96vj   1/1     Running   0          90s
    
    

    详细描述

    [root@hdss7-21 ~]# kubectl describe deployment nginx-dp -n kube-public
    Name:                   nginx-dp
    Namespace:              kube-public
    CreationTimestamp:      Sat, 23 Nov 2019 15:48:18 +0800
    Labels:                 app=nginx-dp                            
    Annotations:            deployment.kubernetes.io/revision: 1                //注解
    Selector:               app=nginx-dp                                                
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
                               预期一个   
    StrategyType:           RollingUpdate    //更新策略,默认滚动发布
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  app=nginx-dp
      Containers:
       nginx:
        Image:        harbor.od.com/public/nginx:v1.7.9
        Port:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   nginx-dp-5dfc689474 (1/1 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  3h    deployment-controller  Scaled up replica set nginx-dp-5dfc689474 to 1
    

    1.1.2.3.查看pod资源

    [root@hdss7-21 ~]# kubectl get pods -n kube-public -o wide
    NAME                        READY   STATUS    RESTARTS   AGE    IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-dp-5dfc689474-v96vj   1/1     Running   0          174m   172.7.21.3   hdss7-21.host.com   <none>           <none>
    

    1.1.2.4.进入pod资源

    [root@hdss7-21 ~]# kubectl exec -ti nginx-dp-5dfc689474-v96vj /bin/bash -n kube-public
    root@nginx-dp-5dfc689474-v96vj:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
        link/ether 02:42:ac:07:15:03 brd ff:ff:ff:ff:ff:ff
        inet 172.7.21.3/24 brd 172.7.21.255 scope global eth0
           valid_lft forever preferred_lft forever
    

    注意,也可以用docker exec,必须是pod运行的那台主机

    1.1.2.5.删除pod资源(重启)

    [root@hdss7-21 ~]# watch -n 1 'kubectl describe deployment nginx-dp -n kube-public|grep -C 5 Event'
    [root@hdss7-21 ~]# kubectl delete pod nginx-dp-5dfc689474-v96vj -n kube-public
    pod "nginx-dp-5dfc689474-v96vj" deleted
    
    [root@hdss7-21 ~]# kubectl get pods -n kube-public -o wide
    NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-dp-5dfc689474-ggxl5   1/1     Running   0          5m29s   172.7.22.3   hdss7-22.host.com   <none>           <none>
    
    

    使用watch观察pod重建状态变化
    强制删除参数:--force --grace-period=0

    1.1.2.6.删除deployment

    [root@hdss7-21 ~]# kubectl  delete deployment nginx-dp -n kube-public
    deployment.extensions "nginx-dp" deleted
    [root@hdss7-21 ~]# kubectl  get all -n kube-public
    
    No resources found.
    

    1.1.3.管理Service资源

    1.1.3.1.创建service

    重新创建回来

    [root@hdss7-21 ~]# kubectl  create deployment nginx-dp --image=harbor.od.com/public/nginx:v1.7.9 -n kube-public
    deployment.apps/nginx-dp created
    
    [root@hdss7-21 ~]# kubectl  get all -n kube-public
    NAME                            READY   STATUS    RESTARTS   AGE
    pod/nginx-dp-5dfc689474-ggsn2   1/1     Running   0          17s
    
    NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nginx-dp   1/1     1            1           17s
    
    NAME                                  DESIRED   CURRENT   READY   AGE
    replicaset.apps/nginx-dp-5dfc689474   1         1         1       17s
    

    创建service

    [root@hdss7-21 ~]# kubectl expose deployment nginx-dp --port=80 -n kube-public
    service/nginx-dp exposed
    

    1.1.3.2.查看service

    [root@hdss7-21 ~]# kubectl  get all -n kube-public            //看到多出来一个service
    NAME                            READY   STATUS    RESTARTS   AGE
    pod/nginx-dp-5dfc689474-ggsn2   1/1     Running   0          112s
    
    
    NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    service/nginx-dp   ClusterIP   192.168.95.151   <none>        80/TCP    24s
    
    
    NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nginx-dp   1/1     1            1           112s
    
    NAME                                  DESIRED   CURRENT   READY   AGE
    replicaset.apps/nginx-dp-5dfc689474   1         1         1       112s
    
    #######由于我们没有安装flannel插件,所有只能到运行pod主机查看###########
    [root@hdss7-21 ~]# kubectl get pod -n kube-public -o wide
    NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-dp-5dfc689474-ggsn2   1/1     Running   0          9m40s   172.7.22.3   hdss7-22.host.com   <none>           <none>
    
    
    [root@hdss7-22 ~]# curl 192.168.95.151
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
        
        
    [root@hdss7-22 ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.0.1:443 nq
      -> 10.4.7.21:6443               Masq    1      0          0         
      -> 10.4.7.22:6443               Masq    1      0          0         
    TCP  192.168.95.151:80 nq
      -> 172.7.22.3:80                Masq    1      0          0  
    

    1.1.3.3.详细查看service

    [root@hdss7-22 ~]# kubectl describe svc nginx-dp -n kube-public
    Name:              nginx-dp
    Namespace:         kube-public
    Labels:            app=nginx-dp
    Annotations:       <none>
    Selector:          app=nginx-dp
    Type:              ClusterIP
    IP:                192.168.95.151
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         172.7.22.3:80
    Session Affinity:  None
    Events:            <none>
    

    1.1.3.4.deployment资源,查看LVS调度

    [root@hdss7-22 ~]# kubectl scale deployment nginx-dp --replicas=2 -n kube-public
    deployment.extensions/nginx-dp scaled
    
    [root@hdss7-22 ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.0.1:443 nq
      -> 10.4.7.21:6443               Masq    1      0          0         
      -> 10.4.7.22:6443               Masq    1      0          0         
    TCP  192.168.95.151:80 nq
      -> 172.7.21.3:80                Masq    1      0          0         
      -> 172.7.22.3:80                Masq    1      0          0      
    

    注意:这个192.168.95.151是预先设置生成的虚拟IP,只在集群内部生效,比如hdss7-11是ping不通的,但是后面我们会有服务暴露的方法traefik来实现。因为没有路由。无法跟外部通信。

    1.1.4.陈述式用法总结

    • 8s集群管理资源的唯一入口是通过响应的方法调用 apiserver的借口
    • kubectl是官方的CLI命令行工具,用于和apiserver通信,将用户在命令行输入的命令转化成apiserver可以识别的信息,今儿实现管理k8s资源
    • kubectl命令大全:
      * --help
      * http://doce.kubernetes.org.cn
    • 陈述式资源管理可以管理90%以上的资源管理需求,缺点也很明显
      *命令冗长,复杂,难记忆
      *特定场景下,无法满足管理需求
      *资源增删查容易,改很痛苦

    1.2.声明式资源管理方法

    1.2.1.查看资源配置清单

    [root@hdss7-22 ~]# kubectl get pods nginx-dp-5dfc689474-hw6vm -o yaml -n kube-public
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: "2019-11-23T11:38:48Z"
      generateName: nginx-dp-5dfc689474-
      labels:
        app: nginx-dp
        pod-template-hash: 5dfc689474
      name: nginx-dp-5dfc689474-hw6vm
      namespace: kube-public
      ownerReferences:
      - apiVersion: apps/v1
        blockOwnerDeletion: true
        controller: true
        kind: ReplicaSet
        name: nginx-dp-5dfc689474
        uid: e0f91f5a-a601-4728-b57e-77f82e2dcc5f
      resourceVersion: "173324"
      selfLink: /api/v1/namespaces/kube-public/pods/nginx-dp-5dfc689474-hw6vm
      uid: 6ecd27e5-89cd-4803-bc9a-6c281c8e3f16
    spec:
      containers:
      - image: harbor.od.com/public/nginx:v1.7.9
        imagePullPolicy: IfNotPresent
        name: nginx
    
    [root@hdss7-22 ~]# kubectl get service -n kube-public
    NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    nginx-dp   ClusterIP   192.168.95.151   <none>        80/TCP    50m 
    
    [root@hdss7-22 ~]# kubectl get service nginx-dp -o yaml  -n kube-public
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2019-11-23T11:25:55Z"
      labels:
        app: nginx-dp
      name: nginx-dp
      namespace: kube-public
      resourceVersion: "172227"
      selfLink: /api/v1/namespaces/kube-public/services/nginx-dp
      uid: f6cc8c7f-50f1-4c75-8eac-8d4a20133af1
    spec:
      clusterIP: 192.168.95.151
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx-dp
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {}
    

    1.2.2.解释资源配置清单(apiversion、kind、meadata、spec)

    [root@hdss7-22 ~]# kubectl explain service.metadata
    KIND:     Service
    VERSION:  v1
    
    RESOURCE: metadata <Object>
    
    DESCRIPTION:
         Standard object's metadata. More info:
         https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    
         ObjectMeta is metadata that all persisted resources must have, which
         includes all objects users must create.
    
    FIELDS:
       annotations	<map[string]string>
         Annotations is an unstructured key value map stored with a resource that
         may be set by external tools to store and retrieve arbitrary metadata. They
         are not queryable and should be preserved when modifying objects. More
         info: http://kubernetes.io/docs/user-guide/annotations
    
       clusterName	<string>
         The name of the cluster which the object belongs to. This is used to
         distinguish resources with same name and namespace in different clusters.
         This field is not set anywhere right now and apiserver is going to ignore
         it if set in create or update request.
    

    1.2.3.创建资源配置清单

    [root@hdss7-200 ~]# vi nginx-ds-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx-ds
      name: nginx-ds
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx-ds
      sessionAffinity: None
      type: ClusterIP
    

    1.2.4.应用资源配置清单

    [root@hdss7-21 ~]# kubectl create -f nginx-ds-svc.yaml 
    service/nginx-ds created
    

    查看(默认default名称空间)

    [root@hdss7-21 ~]# kubectl get svc -n default
    NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP   6d17h
    nginx-ds     ClusterIP   192.168.189.230   <none>        80/TCP    110s
    
    [root@hdss7-21 ~]# kubectl get svc nginx-ds -o yaml
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2019-11-23T12:28:20Z"
      labels:
        app: nginx-ds
      name: nginx-ds
      namespace: default
      resourceVersion: "177549"
      selfLink: /api/v1/namespaces/default/services/nginx-ds
      uid: 24add3a1-cf18-4c29-85fc-65e45f54edbb
    spec:
      clusterIP: 192.168.189.230
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx-ds
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {}
    

    1.2.5.修改资源配置清单并应用

    1.2.5.1.在线修改

    [root@hdss7-21 ~]# kubectl edit svc nginx-ds
    Edit cancelled, no changes made.                               //修改port801
    [root@hdss7-21 ~]# kubectl edit svc nginx-ds
    service/nginx-ds edited
    
    查看:
    [root@hdss7-21 ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP   6d18h
    nginx-ds     ClusterIP   192.168.189.230   <none>        801/TCP   11m
    

    1.2.5.2.离线修改

    [root@hdss7-21 ~]# vi nginx-ds-svc.yaml
    
    [root@hdss7-21 ~]# kubectl apply -f nginx-ds-svc.yaml 
    daemonset.extensions/nginx-ds configured
    

    vim /opt/kubernetes/server/bin/kube-apiserver.sh
    需要在kube-apiserver.sh的配置文件中指定端口范围,--service-node-port-range?10-29999??这个范围在第一次启动service资源的时候不会出问题,但是在apply的时候,会受到限制,王导默认的是3000-29999?,修改以后重启apiserver

    1.2.6.删除资源配置清单

    1.2.6.1.陈述式删除

    [root@hdss7-21 ~]# kubectl delete svc nginx-ds
    service "nginx-ds" deleted
    

    1.2.6.2.声明式删除

    [root@hdss7-21 ~]# kubectl delete -f nginx-ds-svc.yaml
    service "nginx-ds" deleted
    

    1.2.7.声明式用法总结

    • 声明式资源管理,依赖于统一资源配置清单文件对资源进行管理
    • 对资源的管理,通过事先定义在统一配置清单内,在通过陈述式-f命令应用到k8s集群里
    • 语法格式:kubectl create/apply/delete -f /path/to/yaml
    • 不懂的,善用explain查询

    2.k8s的核心插件

    2.1.K8S的CNI网络插件-Flannel

    2.1.1.集群规划

    主机名 角色 ip
    hdss7-21.host.com flannel 10.4.7.21
    hdss7-22.host.com flannel 10.4.7.22

    注意:这里部署以hdss7-21.host.com为例,另外一台运算节点方法类似

    2.1.2.下载软件,解压,做软链

    flannel官方地址

    [root@hdss7-21 ~]# cd /opt/src/
    [root@hdss7-21 src]# wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
    
    [root@hdss7-21 src]# mkdir /opt/flannel-v0.11.0
    [root@hdss7-21 src]# tar xf flannel-v0.11.0-linux-amd64.tar.gz  -C /opt/flannel-v0.11.0/
    [root@hdss7-21 src]# ln -s /opt/flannel-v0.11.0/ /opt/flannel
    

    2.1.3.最终目录结构

    [root@hdss7-21 flannel]# mkdir /opt/flannel/cert
    [root@hdss7-21 flannel]# ll
    total 34436
    drwxr-xr-x 2 root root        6 Nov 23 21:35 cert
    -rwxr-xr-x 1 root root 35249016 Jan 29  2019 flanneld
    -rwxr-xr-x 1 root root     2139 Oct 23  2018 mk-docker-opts.sh
    -rw-r--r-- 1 root root     4300 Oct 23  2018 README.md
    

    2.1.4.拷贝证书

    [root@hdss7-21 cert]# scp hdss7-200:/opt/certs/ca.pem .
    root@hdss7-200's password: 
    ca.pem                                                                                                                                                         100% 1346   961.7KB/s   00:00    
    [root@hdss7-21 cert]# scp hdss7-200:/opt/certs/client.pem .
    root@hdss7-200's password: 
    client.pem                                                                                                                                                     100% 1363    19.3KB/s   00:00    
    [root@hdss7-21 cert]# scp hdss7-200:/opt/certs/client-key.pem .
    root@hdss7-200's password: 
    client-key.pem         
    

    2.1.5.创建配置

    [root@hdss7-21 flannel]# vi subnet.env
    
    FLANNEL_NETWORK=172.7.0.0/16
    FLANNEL_SUBNET=172.7.21.1/24
    FLANNEL_MTU=1500
    FLANNEL_IPMASQ=false
    

    注意:其他节点不同,SUBNET记得更改

    2.1.6.创建启动脚本

    [root@hdss7-21 flannel]# vi flanneld.sh
    
    !/bin/sh
    ./flanneld 
      --public-ip=10.4.7.21 
      --etcd-endpoints=https://10.4.7.12:2379,https://10.4.7.21:2379,https://10.4.7.22:2379 
      --etcd-keyfile=./cert/client-key.pem 
      --etcd-certfile=./cert/client.pem 
      --etcd-cafile=./cert/ca.pem 
      --iface=eth0 
      --subnet-file=./subnet.env 
      --healthz-port=2401
    

    注意:其他节点不同,public-ip记得更改

    2.1.7.检查配置,权限,创建日志目录

    [root@hdss7-21 flannel]# chmod +x flanneld.sh 
    [root@hdss7-21 flannel]# mkdir -p /data/logs/flanneld
    

    2.1.8.创建supervisor配置

    [root@hdss7-21 flannel]# vi /etc/supervisord.d/flannel.ini
    [program:flanneld-7-21]
    command=/opt/flannel/flanneld.sh                             ; the program (relative uses PATH, can take args)
    numprocs=1                                                   ; number of processes copies to start (def 1)
    directory=/opt/flannel                                       ; directory to cwd to before exec (def no cwd)
    autostart=true                                               ; start at supervisord start (default: true)
    autorestart=true                                             ; retstart at unexpected quit (default: true)
    startsecs=30                                                 ; number of secs prog must stay running (def. 1)
    startretries=3                                               ; max # of serial start failures (default 3)
    exitcodes=0,2                                                ; 'expected' exit codes for process (default 0,2)
    stopsignal=QUIT                                              ; signal used to kill process (default TERM)
    stopwaitsecs=10                                              ; max num secs to wait b4 SIGKILL (default 10)
    user=root                                                    ; setuid to this UNIX account to run the program
    redirect_stderr=true                                         ; redirect proc stderr to stdout (default false)
    stdout_logfile=/data/logs/flanneld/flanneld.stdout.log       ; stderr log path, NONE for none; default AUTO
    stdout_logfile_maxbytes=64MB                                 ; max # logfile bytes b4 rotation (default 50MB)
    stdout_logfile_backups=4                                     ; # of stdout logfile backups (default 10)
    stdout_capture_maxbytes=1MB                                  ; number of bytes in 'capturemode' (default 0)
    stdout_events_enabled=false                                  ; emit events on stdout writes (default false)
    

    注意:其他节点不同,记得修改program

    2.1.9.操作etcd,增加host-gw

    [root@hdss7-21 etcd]# ./etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}'
    {"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}
    
    查看
    [root@hdss7-21 etcd]# ./etcdctl get /coreos.com/network/config
    {"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}
    

    2.1.10.启动服务并检查

    [root@hdss7-21 flannel]# supervisorctl  update
    flanneld-7-21: added process group
    [root@hdss7-21 flannel]# supervisorctl status
    flanneld-7-21                    RUNNING   pid 8173, uptime 0:01:49
    
    [root@hdss7-21 flannel]# tail -fn 200 /data/logs/flanneld/flanneld.stdout.log 
    I1123 21:53:59.294735    8174 main.go:527] Using interface with name eth0 and address 10.4.7.21
    I1123 21:53:59.294855    8174 main.go:540] Using 10.4.7.21 as external address
    2019-11-23 21:53:59.295437 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
    I1123 21:53:59.295497    8174 main.go:244] Created subnet manager: Etcd Local Manager with Previous Subnet: 172.7.21.0/24
    I1123 21:53:59.295502    8174 main.go:247] Installing signal handlers
    I1123 21:53:59.295794    8174 main.go:587] Start healthz server on 0.0.0.0:2401
    I1123 21:53:59.306259    8174 main.go:386] Found network config - Backend type: host-gw
    I1123 21:53:59.309982    8174 local_manager.go:201] Found previously leased subnet (172.7.21.0/24), reusing
    I1123 21:53:59.312191    8174 local_manager.go:220] Allocated lease (172.7.21.0/24) to current node (10.4.7.21) 
    I1123 21:53:59.312442    8174 main.go:317] Wrote subnet file to ./subnet.env
    I1123 21:53:59.312449    8174 main.go:321] Running backend.
    I1123 21:53:59.312717    8174 route_network.go:53] Watching for new subnet leases
    I1123 21:53:59.314605    8174 main.go:429] Waiting for 22h59m59.994825456s to renew lease
    I1123 21:53:59.315253    8174 iptables.go:145] Some iptables rules are missing; deleting and recreating rules
    I1123 21:53:59.315274    8174 iptables.go:167] Deleting iptables rule: -s 172.7.0.0/16 -j ACCEPT
    I1123 21:53:59.316551    8174 iptables.go:167] Deleting iptables rule: -d 172.7.0.0/16 -j ACCEPT
    I1123 21:53:59.318336    8174 iptables.go:155] Adding iptables rule: -s 172.7.0.0/16 -j ACCEPT
    I1123 21:53:59.327024    8174 iptables.go:155] Adding iptables rule: -d 172.7.0.0/16 -j ACCEPT
    

    2.1.11安装部署启动检查所有集群规划节点

    • 其他节点基本和hdss7-21相同,注意修改一下文件:
    • subnet.env
    • flanneld.sh
    • /etc/supervisord.d/flannel.ini

    2.1.12.再次验证集群,POD之间网络互通

    [root@hdss7-22 flannel]# ping 172.7.21.2
    PING 172.7.21.2 (172.7.21.2) 56(84) bytes of data.
    64 bytes from 172.7.21.2: icmp_seq=1 ttl=63 time=0.554 ms
    64 bytes from 172.7.21.2: icmp_seq=2 ttl=63 time=0.485 ms
    
    [root@hdss7-21 flannel]# ping 172.7.22.2
    PING 172.7.22.2 (172.7.22.2) 56(84) bytes of data.
    64 bytes from 172.7.22.2: icmp_seq=1 ttl=63 time=0.271 ms
    64 bytes from 172.7.22.2: icmp_seq=2 ttl=63 time=0.196 ms
    

    2.1.13.在各运算节点上优化iptables规则

    2.1.13.1.编辑并应用nginx-ds.yaml

    hdss7-21 上

    [root@hdss7-21 ~]# vi nginx-ds.yaml
    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: nginx-ds
    spec:
      template:
        metadata:
          labels:
            app: nginx-ds
        spec:
          containers:
          - name: my-nginx
            image: harbor.od.com/public/nginx:curl
            ports:
            - containerPort: 80
    [root@hdss7-21 ~]# kubectl apply -f nginx-ds.yaml 
    Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
    daemonset.extensions/nginx-ds configured        
    
    

    2.1.13.2.重启pod加载nginx:url

    [root@hdss7-21 ~]# kubectl get pods -n default
    NAME             READY   STATUS    RESTARTS   AGE
    nginx-ds-mcvxt   1/1     Running   1          6d22h
    nginx-ds-zsnz9   1/1     Running   1          6d22h
    
    [root@hdss7-21 ~]# kubectl delete pod nginx-ds-mcvxt
    pod "nginx-ds-mcvxt" deleted
    [root@hdss7-21 ~]# kubectl delete pod nginx-ds-zsnz9
    pod "nginx-ds-zsnz9" deleted
    
    [root@hdss7-21 ~]# kubectl get pods -n default -o wide
    NAME             READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-ds-d5kl8   1/1     Running   0          44s   172.7.22.2   hdss7-22.host.com   <none>           <none>
    nginx-ds-jtn62   1/1     Running   0          56s   172.7.21.2   hdss7-21.host.com   <none>           <none>
    

    2.1.13.3.进入21.2的节点pod,curl hdss7-22的主机

    [root@hdss7-21 ~]# kubectl exec nginx-ds-jtn62 /bin/bash
    [root@hdss7-21 ~]# kubectl exec -ti nginx-ds-jtn62 /bin/bash
    root@nginx-ds-jtn62:/# 
    root@nginx-ds-jtn62:/# 
    root@nginx-ds-jtn62:/# 
    root@nginx-ds-jtn62:/# curl 172.7.22.2
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
    

    2.1.13.4.查看hdss7-22的nginx访问日志

    [root@hdss7-22 flannel]# kubectl get pods -o wide
    NAME             READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-ds-d5kl8   1/1     Running   0          5m24s   172.7.22.2   hdss7-22.host.com   <none>           <none>
    nginx-ds-jtn62   1/1     Running   0          5m36s   172.7.21.2   hdss7-21.host.com   <none>           <none>
    [root@hdss7-22 flannel]# 
    [root@hdss7-22 flannel]# 
    [root@hdss7-22 flannel]# 
    [root@hdss7-22 flannel]# 
    [root@hdss7-22 flannel]# kubectl  logs -f nginx-ds-d5kl8
    10.4.7.21 - - [23/Nov/2019:16:57:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.38.0" "-"
    10.4.7.21 - - [23/Nov/2019:17:01:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.38.0" "-"
    //由此可看出节点访问ip是10.4.7.21,不应该是物理机的ip,说明做了snat转换,而我们希望看到的是容器的真实IP
    

    2.1.13.5.安装iptables-services并设置规则

    注意:另一节点,注意iptables规则略有不同,其他运算节点执行时注意修改

    • 安装iptables-services并设置开机启动
    [root@hdss7-21 ~]# yum install iptables-services  -y
    [root@hdss7-21 ~]# systemctl start iptables
    [root@hdss7-21 ~]# systemctl enable  iptables
    
    • 优化SNAT规则,各运算节点之前的各POD之前的网络通信不再出网
    [root@hdss7-21 ~]# iptables -t nat -D POSTROUTING -s 172.7.21.0/24 ! -o docker0 -j MASQUERADE
    [root@hdss7-21 ~]# iptables -t nat -I POSTROUTING -s 172.7.21.0/24 ! -d 172.7.0.0/16 ! -o docker0 -j MASQUERADE
    [root@hdss7-21 ~]# iptables-save |grep -i postrouting
    
     iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
     iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
    ##########规则定义#########
    10.4.7.21主机上的,来源是172.7.21.0/24段的docker的ip,目标ip不是172.7.0.0/16段,网络发包不从docker0桥设备出站的,才进行SNAT转换
    

    2.1.14.个运算节点保存iptables规则

    • 各运算节点保存iptables规则
    ~]# service iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    
    • 各自访问对方节点,并查看nginx-access日志,可看到现在暴露的都是容器ip
    [root@hdss7-21 ~]#  kubectl  logs -f nginx-ds-jtn62
    172.7.22.2 - - [23/Nov/2019:17:46:48 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.38.0" "-"
    [root@hdss7-22 ~]# kubectl  logs -f nginx-ds-d5kl8
    10.4.7.21 - - [23/Nov/2019:17:01:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.38.0" "-"
    
    172.7.21.2 - - [23/Nov/2019:17:43:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.38.0" "-"
    

    2.1.15.原理剖析

    flannetl host-gw模型

    注意:此模型前提条件,所有的宿主机在同一个二层网络下,也就是说他们指向的是同一个网关设备,此模型效率最高

    [root@hdss7-21 ~}#route add -net 172.7.22.0/24 gw 10.4.7.22 dev eth0
    [root@hdss7-22~}#route add -net 172.7.21.0/24 gw 10.4.7.21 dev eth0
    [root@hdss7-21 flannel]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         10.4.7.254      0.0.0.0         UG    100    0        0 eth0
    10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
    172.7.21.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
    172.7.22.0      10.4.7.22       255.255.255.0   UG    0      0        0 eth0
    
    [root@hdss7-22 flannel]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         10.4.7.254      0.0.0.0         UG    100    0        0 eth0
    10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
    172.7.21.0      10.4.7.21       255.255.255.0   UG    0      0        0 eth0
    172.7.22.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
    
    注意还要优化一条iptables规则:
    ~]#  iptables -t filter -I FORWARD -d 172.7.21.0/24 -j ACCEPT
    

    2.1.16.flannel VxLAN模型

    使用方法:
    1、先停止flennel.sh ---通过supervisor stop flanneld-7-[21.22]
    2、删除host-gw模型创建的路由
    route del -net 172.7.21.0/24 gw 10.4.7.21     hdss7-22上
    route del -net 172.7.22.0/24 gw 10.4.7.22     hdss7-21上
    3、在etcd节点修改
    ./etcdctl get /coreos.com/network/config
    ./etcdctl rm /coreos.com/network/config
    etcd]# ./etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN"}}'
    4、supervisorctl start flanneld-7-21
        supervisorctl start flanneld-7-22
    5、查看ifconfig 会多了一个flannel 1的设备,route -n是没有路由的
    

    2.1.17.flannel直接路由模型(智能判定)

    类似与mysql日志的mixed模式

    '{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN","Directrouting": true}}'
    

    2.2.K8S的服务发现插件-CoreDNS

    实现k8s里的DNS功能的插件

    • kube-dns-kebernetes-v1.2至v1.10
    • Coredns-kubenetes-v1.11至今
      注意k8s里的dns不是万能的!它应该只负责自动维护“服务名”-->“集群网络IP”之间的关系

    2.2.1.部署k8s的内网资源配置清单

    注意:在运维主机hdss-200上,配置一个nginx虚拟主机,用以提供k8s统一的资源访问清单入口

    2.2.1.1.配置nginx

    [root@hdss7-200 html]# vi /etc/nginx/conf.d/k8s-yaml.od.com.conf
    server {
        listen       80;
        server_name  k8s-yaml.od.com;
    
        location / {
            autoindex on;
            default_type text/plain;
            root /data/k8s-yaml;
        }
    }
    [root@hdss7-200 html]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@hdss7-200 html]# nginx -s reload
    
    建立yaml目录和coredns的yaml目录
    [root@hdss7-200 data]# mkdir /data/k8s-yaml
    [root@hdss7-200 data]# cd k8s-yaml/
    [root@hdss7-200 k8s-yaml]# mkdir coredns
    

    2.2.1.2.配置dns解析

    [root@hdss7-11 ~]# vi /var/named/od.com.zone
    $ORIGIN od.com.
    $TTL 600        ; 10 minutes
    @               IN SOA  dns.od.com. dnsadmin.od.com. (
                                    2019111003 ; serial
                                    10800      ; refresh (3 hours)
                                    900        ; retry (15 minutes)
                                    604800     ; expire (1 week)
                                    86400      ; minimum (1 day)
                                    )
                                    NS   dns.od.com.
    $TTL 60 ; 1 minute
    dns                A    10.4.7.11
    harbor             A    10.4.7.200
    k8s-yaml           A    10.4.7.200
    
    [root@hdss7-11 ~]# systemctl restart named
    [root@hdss7-11 ~]# dig -t A k8s-yaml.od.com @10.4.7.11 +short
    10.4.7.200
    

    2.2.1.3.浏览器访问k8s-yaml.od.com

    **可以看到所有的目录和yaml文件

    2.2.2.部署coredns

    官方GitHub地址

    吐血推荐黄导之kubernetes内部域名解析原理、弊端及优化方式----黄导

    2.2.2.1.下载docker镜像并打包推到harbor仓库

    [root@hdss7-200 ~]# docker pull coredns/coredns:1.6.1
    [root@hdss7-200 coredns]# docker tag c0f6e815079e harbor.od.com/public/coredns:v1.6.1
    
    [root@hdss7-200 coredns]# docker  push harbor.od.com/public/coredns:v1.6.1
    

    2.2.2.2.准备资源配置清单

    [https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base]
    rbac.yaml

    [root@hdss7-200 coredns]# vi rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: coredns
      namespace: kube-system
      labels:
          kubernetes.io/cluster-service: "true"
          addonmanager.kubernetes.io/mode: Reconcile
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        kubernetes.io/bootstrapping: rbac-defaults
        addonmanager.kubernetes.io/mode: Reconcile
      name: system:coredns
    rules:
    - apiGroups:
      - ""
      resources:
      - endpoints
      - services
      - pods
      - namespaces
      verbs:
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
      labels:
        kubernetes.io/bootstrapping: rbac-defaults
        addonmanager.kubernetes.io/mode: EnsureExists
      name: system:coredns
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:coredns
    subjects:
    - kind: ServiceAccount
      name: coredns
      namespace: kube-system
    

    cm.yaml

    [root@hdss7-200 coredns]# vi cm.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
    data:
      Corefile: |
        .:53 {
            errors
            log
            health
            ready
            kubernetes cluster.local 192.168.0.0/16
            forward . 10.4.7.11
            cache 30
            loop
            reload
            loadbalance
           }
    

    dp.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coredns
      namespace: kube-system
      labels:
        k8s-app: coredns
        kubernetes.io/name: "CoreDNS"
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: coredns
      template:
        metadata:
          labels:
            k8s-app: coredns
        spec:
          priorityClassName: system-cluster-critical
          serviceAccountName: coredns
          containers:
          - name: coredns
            image: harbor.od.com/public/coredns:v1.6.1
            args:
            - -conf
            - /etc/coredns/Corefile
            volumeMounts:
            - name: config-volume
              mountPath: /etc/coredns
            ports:
            - containerPort: 53
              name: dns
              protocol: UDP
            - containerPort: 53
              name: dns-tcp
              protocol: TCP
            - containerPort: 9153
              name: metrics
              protocol: TCP
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 60
              timeoutSeconds: 5
              successThreshold: 1
              failureThreshold: 5
          dnsPolicy: Default
          volumes:
            - name: config-volume
              configMap:
                name: coredns
                items:
                - key: Corefile
                  path: Corefile
    

    svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: coredns
      namespace: kube-system
      labels:
        k8s-app: coredns
        kubernetes.io/cluster-service: "true"
        kubernetes.io/name: "CoreDNS"
    spec:
      selector:
        k8s-app: coredns
      clusterIP: 192.168.0.2
      ports:
      - name: dns
        port: 53
        protocol: UDP
      - name: dns-tcp
        port: 53
      - name: metrics
        port: 9153
        protocol: TCP
    

    2.2.2.3.应用资源配置清单

    在任意运算节点上应用

    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/rbac.yaml
    serviceaccount/coredns created
    clusterrole.rbac.authorization.k8s.io/system:coredns created
    clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/cm.yaml
    configmap/coredns created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/dp.yaml
    deployment.apps/coredns created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/svc.yaml
    service/coredns created
    

    2.2.2.4.查看创建的资源

    [root@hdss7-21 ~]# kubectl get all -n kube-system
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/coredns-6b6c4f9648-wrrbt   1/1     Running   0          111s
    
    
    NAME              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
    service/coredns   ClusterIP   192.168.0.2   <none>        53/UDP,53/TCP,9153/TCP   99s
    
    
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/coredns   1/1     1            1           111s
    
    NAME                                 DESIRED   CURRENT   READY   AGE
    replicaset.apps/coredns-6b6c4f9648   1         1         1       111s
    

    详细查看

    [root@hdss7-21 ~]# kubectl get all -n kube-system -o wide
    NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    pod/coredns-6b6c4f9648-wrrbt   1/1     Running   0          4m56s   172.7.21.4   hdss7-21.host.com   <none>           <none>
    
    
    NAME              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
    service/coredns   ClusterIP   192.168.0.2   <none>        53/UDP,53/TCP,9153/TCP   4m44s   k8s-app=coredns
    
    
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                                SELECTOR
    deployment.apps/coredns   1/1     1            1           4m56s   coredns      harbor.od.com/public/coredns:v1.6.1   k8s-app=coredns
    
    NAME                                 DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                                SELECTOR
    replicaset.apps/coredns-6b6c4f9648   1         1         1       4m56s   coredns      harbor.od.com/public/coredns:v1.6.1   k8s-app=coredns,pod-template-hash=6b6c4f9648
    

    2.2.2.5.验证coredns

    [root@hdss7-21 ~]# dig -t A www.baidu.com @192.168.0.2 +short
    www.a.shifen.com.
    39.156.66.18
    39.156.66.14
    [root@hdss7-21 ~]# dig -t A hdss7-21.host.com  @192.168.0.2 +short
    10.4.7.21                //自建dns是coredns上级dns,所以差得到
    
    [root@hdss7-21 ~]# kubectl get svc -o wide
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   192.168.0.1   <none>        443/TCP   7d    <none>
    
    [root@hdss7-21 ~]# 
    [root@hdss7-21 ~]# kubectl get pods -n kube-public
    NAME                        READY   STATUS    RESTARTS   AGE
    nginx-dp-5dfc689474-ggsn2   1/1     Running   0          7h23m
    nginx-dp-5dfc689474-hw6vm   1/1     Running   0          7h8m
    
    查看:
    [root@hdss7-21 ~]# kubectl expose deployment nginx-dp --port=80 -n kube-public
    [root@hdss7-21 ~]# kubectl get svc -o wide -n kube-public
    NAME       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
    nginx-dp   ClusterIP   192.168.95.151   <none>        80/TCP    7h21m   app=nginx-dp
    验证:
    [root@hdss7-21 ~]# dig -t A nginx-dp @192.168.0.2 +short
    [root@hdss7-21 ~]# dig -t A nginx-dp.kube-public.svc.cluster.local.  @192.168.0.2 +short
    192.168.95.151
    
    

    找台宿主机验证

    查看:
    [root@hdss7-21 ~]# kubectl get pods -o wide
    NAME             READY   STATUS    RESTARTS   AGE    IP           NODE                NOMINATED NODE   READINESS GATES
    nginx-ds-d5kl8   1/1     Running   0          120m   172.7.22.2   hdss7-22.host.com   <none>           <none>
    nginx-ds-jtn62   1/1     Running   0          120m   172.7.21.2   hdss7-21.host.com   <none>           <none>
    
    进入宿主机容器:
    [root@hdss7-21 ~]# kubectl exec -ti nginx-ds-jtn62 /bin/bash
    root@nginx-ds-jtn62:/# 
    
    验证:
    root@nginx-ds-jtn62:/# curl 192.168.95.151
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    
    root@nginx-ds-jtn62:/# curl nginx-dp.kube-public
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
             35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
            
    为什么容器里不用加FQDN?
    原因:
    root@nginx-ds-jtn62:/# cat /etc/resolv.conf 
    nameserver 192.168.0.2
    search default.svc.cluster.local svc.cluster.local cluster.local host.com
    options ndots:5            //dns递归查询的层级,默认5层,效率低,可以参考黄导文章
    

    2.3.K8S的服务暴露插件-Traefik

    起因:其实此时外部无法解析到,coredns只对内部解析

    [root@hdss7-21 ~]# curl nginx-dp.kube-public.svc.cluster.local.
    curl: (6) Could not resolve host: nginx-dp.kube-public.svc.cluster.local.; Unknown error
    

    由来:以上案例,k8s的dns实现了服务在集群"内"被自动发现,那如何是的服务在k8s集群 "外"被使用和访问呢?

    2.3.1.NodePort

    注意:无法使用kube-proxy的ipvs模型,只能用iptables模型,调度算法也只支持 RR。

    2.3.1.1.修改nginx-ds的service资源配置清单

    2.3.1.2.重建nginx-ds的service资源

    2.3.1.3.查看service

    2.3.1.4.浏览器访问

    略。。。以后更新

    2.3.2.部署traefik(ingress控制器)

    注意:

    • Ingress只能调度并爆露7层应用,特指http和https协议
    • Ingress 是k8s API的标准资源类型之一,也是一种核心资源,它其实就是一组基于域名和URL路径,把用户的请求转发至指定Service资源的规则
    • 可以将集群外部的请求流量,转发至集群内部,从而实现服务爆露
    • Ingress控制器是能够为Igress资源监听某套接字,然后根据Ingress规则匹配机制路由调度流量的一个组件。
    • 谁白了,Ingress没啥神秘的,就是个nginx+一段go脚本而已

    2.3.2.1.准备traefik镜像,打包,并上传到harbor仓库

    官方GitHub地址

    运维主机hdss7-200上

    [root@hdss7-200 k8s-yaml]# docker pull traefik:v1.7.2-alpine
    [root@hdss7-200 k8s-yaml]# docker images|grep traefik
    traefik                         v1.7.2-alpine              add5fac61ae5        13 months ago       72.4MB
    [root@hdss7-200 k8s-yaml]# docker tag add5fac61ae5 harbor.od.com/public/traefik:v1.7.2
    [root@hdss7-200 k8s-yaml]# docker push  harbor.od.com/public/traefik:v1.7.2
    The push refers to repository [harbor.od.com/public/traefik]
    a02beb48577f: Pushed 
    ca22117205f4: Pushed 
    3563c211d861: Pushed 
    df64d3292fd6: Pushed 
    v1.7.2: digest: sha256:6115155b261707b642341b065cd3fac2b546559ba035d0262650b3b3bbdd10ea size: 1157
    
    

    2.3.2.2.准备资源配置清单

    运维主机hdss7-200上
    官方的yaml文件

    rbac.yaml

    [root@hdss7-200 k8s-yaml]# mkdir traefik
    [root@hdss7-200 k8s-yaml]# cd traefik/
    [root@hdss7-200 traefik]# vi rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: traefik-ingress-controller
    rules:
      - apiGroups:
          - ""
        resources:
          - services
          - endpoints
          - secrets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
      name: traefik-ingress-controller
      namespace: kube-system
    

    ds.ymal

    [root@hdss7-200 traefik]# vi ds.yaml
    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: traefik-ingress
      namespace: kube-system
      labels:
        k8s-app: traefik-ingress
    spec:
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress
            name: traefik-ingress
        spec:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          containers:
          - image: harbor.od.com/public/traefik:v1.7.2
            name: traefik-ingress
            ports:
            - name: controller
              containerPort: 80
              hostPort: 81
            - name: admin-web
              containerPort: 8080
            securityContext:
              capabilities:
                drop:
                - ALL
                add:
                - NET_BIND_SERVICE
            args:
            - --api
            - --kubernetes
            - --logLevel=INFO
            - --insecureskipverify=true
            - --kubernetes.endpoint=https://10.4.7.10:7443
            - --accesslog
            - --accesslog.filepath=/var/log/traefik_access.log
            - --traefiklog
            - --traefiklog.filepath=/var/log/traefik.log
            - --metrics.prometheus
    

    svc.yaml

    kind: Service
    apiVersion: v1
    metadata:
      name: traefik-ingress-service
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress
      ports:
        - protocol: TCP
          port: 80
          name: controller
        - protocol: TCP
          port: 8080
          name: admin-web
    

    ingress.yaml

    [root@hdss7-200 traefik]# vi ingress.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: traefik-web-ui
      namespace: kube-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: traefik.od.com
        http:
          paths:
          - path: /
            backend:
              serviceName: traefik-ingress-service
              servicePort: 8080
    

    2.3.2.3.应用资源配置清单

    任意一台运算节点上

    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/traefik/rbac.yaml
    serviceaccount/traefik-ingress-controller created
    clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
    clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/traefik/ds.yaml
    daemonset.extensions/traefik-ingress created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/traefik/svc.yaml
    service/traefik-ingress-service created
    
    [root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/traefik/ingress.yaml
    ingress.extensions/traefik-web-ui created
    

    2.3.2.4.检查创建的资源

    [root@hdss7-21 ~]# kubectl get pods -n kube-system
    NAME                       READY   STATUS    RESTARTS   AGE
    coredns-6b6c4f9648-wrrbt   1/1     Running   0          108m
    traefik-ingress-9z6wd      1/1     Running   0          10m
    traefik-ingress-ksznv      1/1     Running   0          10m
    

    报错:
    [root@hdss7-21 ~]# kubectl describe pods traefik-ingress-ksznv -n kube-system
    Warning FailedCreatePodSandBox 6m23s kubelet, hdss7-21.host.com Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "traefik-ingress-ksznv": Error response from daemon: driver failed programming external connectivity on endpoint k8s_POD_traefik-ingress-ksznv_kube-system_d1389546-d27b-47cd-92c1-f5a8963043fd_0 (2f032861a4eb0e5240554e388b8ae8a5efd9ead3c56e50840aacdf43570c434b): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.7.21.5 --dport 80 -j ACCEPT: iptables: No chain/target/match by that name.
    解决:
    systemctl restart docker.service

    2.3.3.解析域名

    [root@hdss7-11 ~]# vi /var/named/od.com.zone
    $ORIGIN od.com.
    $TTL 600        ; 10 minutes
    @               IN SOA  dns.od.com. dnsadmin.od.com. (
                                    2019111004 ; serial
                                    10800      ; refresh (3 hours)
                                    900        ; retry (15 minutes)
                                    604800     ; expire (1 week)
                                    86400      ; minimum (1 day)
                                    )
                                    NS   dns.od.com.
    $TTL 60 ; 1 minute
    dns                A    10.4.7.11
    harbor             A    10.4.7.200
    k8s-yaml           A    10.4.7.200
    traefik            A    10.4.7.10
    
    [root@hdss7-11 ~]# systemctl restart named
    

    2.3.4.配置反代

    注意:hdss7-11和hdss7-12都要配置

    [root@hdss7-11 ~]# vi /etc/nginx/conf.d/od.com.conf
    upstream default_backend_traefik {
        server 10.4.7.21:81    max_fails=3 fail_timeout=10s;
        server 10.4.7.22:81    max_fails=3 fail_timeout=10s;
    }
    server {
        server_name *.od.com;
      
        location / {
            proxy_pass http://default_backend_traefik;
            proxy_set_header Host       $http_host;
            proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        }
    }
    [root@hdss7-11 ~]# nginx -t
    [root@hdss7-11 ~]# nginx -s reload
    

    2.3.5.浏览器访问

    2.4.k8S的GUI资源管理插件-仪表盘

    2.4.1.部署kubernetes-dashboard

    dashboard官方GitHub

    2.4.1.1.准备dashboard镜像

    [root@hdss7-200 harbor]# docker pull k8scn/kubernetes-dashboard-amd64:v1.8.3
    v1.8.3: Pulling from k8scn/kubernetes-dashboard-amd64
    a4026007c47e: Pull complete 
    Digest: sha256:ebc993303f8a42c301592639770bd1944d80c88be8036e2d4d0aa116148264ff
    Status: Downloaded newer image for k8scn/kubernetes-dashboard-amd64:v1.8.3
    docker.io/k8scn/kubernetes-dashboard-amd64:v1.8.3
    [root@hdss7-200 harbor]# docker images|grep dashboard
    k8scn/kubernetes-dashboard-amd64   v1.8.3                     fcac9aa03fd6        18 months ago       102MB
    
    [root@hdss7-200 harbor]# docker tag fcac9aa03fd6  harbor.od.com/public/dashboard:v1.8.3
    
    [root@hdss7-200 harbor]# docker push harbor.od.com/public/dashboard:v1.8.3
    The push refers to repository [harbor.od.com/public/dashboard.od.com]
    23ddb8cbb75a: Pushed 
    v1.8.3: digest: sha256:ebc993303f8a42c301592639770bd1944d80c88be8036e2d4d0aa116148264ff size: 529
    
    

    2.4.1.2.创建资源配置清单

    资源配置清单来源
    运维主机hdss7-200上

    [root@hdss7-200 harbor]# mkdir -p /data/k8s-yaml/dashboard && cd /data/k8s-yaml/dashboard
    
    [root@hdss7-200 dashboard]# vi rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        addonmanager.kubernetes.io/mode: Reconcile
      name: kubernetes-dashboard-admin
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: kubernetes-dashboard-admin
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        addonmanager.kubernetes.io/mode: Reconcile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: kubernetes-dashboard-admin
      namespace: kube-system
      
      [root@hdss7-200 dashboard]# vi dp.yaml
      apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    spec:
      selector:
        matchLabels:
          k8s-app: kubernetes-dashboard
      template:
        metadata:
          labels:
            k8s-app: kubernetes-dashboard
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ''
        spec:
          priorityClassName: system-cluster-critical
          containers:
          - name: kubernetes-dashboard
            image: harbor.od.com/public/dashboard:v1.8.3
            resources:
              limits:
                cpu: 100m
                memory: 300Mi
              requests:
                cpu: 50m
                memory: 100Mi
            ports:
            - containerPort: 8443
              protocol: TCP
            args:
              # PLATFORM-SPECIFIC ARGS HERE
              - --auto-generate-certificates
            volumeMounts:
            - name: tmp-volume
              mountPath: /tmp
            livenessProbe:
              httpGet:
                scheme: HTTPS
                path: /
                port: 8443
              initialDelaySeconds: 30
              timeoutSeconds: 30
          volumes:
          - name: tmp-volume
            emptyDir: {}
          serviceAccountName: kubernetes-dashboard-admin
          tolerations:
          - key: "CriticalAddonsOnly"
            operator: "Exists"
            
    [root@hdss7-200 dashboard]# vi svc.yaml
       apiVersion: v1
    kind: Service
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      labels:
        k8s-app: kubernetes-dashboard
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    spec:
      selector:
        k8s-app: kubernetes-dashboard
      ports:
      - port: 443
        targetPort: 8443
     [root@hdss7-200 dashboard]# vi ingress.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: kubernetes-dashboard
      namespace: kube-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: dashboard.od.com
        http:
          paths:
          - backend:
              serviceName: kubernetes-dashboard
              servicePort: 443 
        
    

    2.4.1.3.应用资源配置清单

    [root@hdss7-21 containers]# kubectl apply -f http://k8s-yaml.od.com/dashboard/rbac.yaml
    serviceaccount/kubernetes-dashboard-admin created
    clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-admin created
    
    [root@hdss7-21 containers]# kubectl apply -f http://k8s-yaml.od.com/dashboard/dp.yaml
    deployment.apps/kubernetes-dashboard created
    
    [root@hdss7-21 containers]# kubectl apply -f http://k8s-yaml.od.com/dashboard/svc.yaml
    service/kubernetes-dashboard created
    
    [root@hdss7-21 containers]# kubectl apply -f http://k8s-yaml.od.com/dashboard/ingress.yaml
    ingress.extensions/kubernetes-dashboard created
    

    2.4.1.4.查看创建的资源

    [root@hdss7-21 containers]# kubectl get pods -n kube-system
    NAME                                    READY   STATUS             RESTARTS   AGE
    coredns-6b6c4f9648-wrrbt                1/1     Running            0          6d8h
    kubernetes-dashboard-76dcdb4677-t4swp   0/1     ImagePullBackOff   0          10m
    traefik-ingress-jsrcs                   1/1     Running            0          24h
    traefik-ingress-v4qxh                   1/1     Running            0          24h
    
    [root@hdss7-21 containers]# kubectl get svc -n kube-system
    NAME                      TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)                  AGE
    coredns                   ClusterIP   192.168.0.2       <none>        53/UDP,53/TCP,9153/TCP   6d8h
    kubernetes-dashboard      ClusterIP   192.168.134.43    <none>        443/TCP                  10m
    traefik-ingress-service   ClusterIP   192.168.130.180   <none>        80/TCP,8080/TCP          6d6h
    
    [root@hdss7-21 containers]# kubectl get ingress -n kube-system
    NAME                   HOSTS              ADDRESS   PORTS   AGE
    kubernetes-dashboard   dashboard.od.com             80      11m
    traefik-web-ui         traefik.od.com               80      6d6h
    

    2.4.2.解析域名

    dhss7-11上

    [root@hdss7-11 conf.d]# vi /var/named/od.com.zone
    $ORIGIN od.com.
    $TTL 600        ; 10 minutes
    @               IN SOA  dns.od.com. dnsadmin.od.com. (
                                    2019111005 ; serial            //前滚一个序列号
                                    10800      ; refresh (3 hours)
                                    900        ; retry (15 minutes)
                                    604800     ; expire (1 week)
                                    86400      ; minimum (1 day)
                                    )
                                    NS   dns.od.com.
    $TTL 60 ; 1 minute
    dns                A    10.4.7.11
    harbor             A    10.4.7.200
    k8s-yaml           A    10.4.7.200
    traefik            A    10.4.7.10
    dashboard          A    10.4.7.10
    
    [root@hdss7-11 conf.d]# systemctl restart named
    
    [root@hdss7-11 conf.d]# dig -t A dashboard.od.com @10.4.7.11 +short
    10.4.7.10
    [root@hdss7-21 containers]# dig -t A dashboard.od.com @192.168.0.2 +short
    10.4.7.10
    

    注意:生产上不建议直接restart named,建议rndc 来 reload

    2.4.3.浏览器访问

    注意:dashboardv1.8.3直接可以跳过,需要升级更高版本,拿令牌登陆,需要https,上图也可以看到,现实不安全的连接

    //令牌命令行获取方式:

    [root@hdss7-21 conf]# kubectl get secret -n kube-system
    NAME                                     TYPE                                  DATA   AGE
    coredns-token-mhstl                      kubernetes.io/service-account-token   3      6d10h
    default-token-ntmvw                      kubernetes.io/service-account-token   3      13d
    kubernetes-dashboard-admin-token-ws4ck   kubernetes.io/service-account-token   3      137m
    kubernetes-dashboard-key-holder          Opaque                                2      94m
    traefik-ingress-controller-token-55b2f   kubernetes.io/service-account-token   3      6d9h
    
    conf]# kubectl describe secret kubernetes-dashboard-admin-token-ws4ck -n kube-system
    

    2.4.4.配置认证

    2.4.4.1.openssl签发证书(可选)

    setp1:先去创建dashboard.od.com网站的私钥
    [root@hdss7-200 certs]# (umask 077; openssl genrsa -out dashboard.od.com.key  2048)
    Generating RSA private key, 2048 bit long modulus
    ....................+++
    ........+++
    e is 65537 (0x10001)
    
    setp2:openssl命令去做证书签发的请求文件
    [root@hdss7-200 certs]# openssl req -new -key dashboard.od.com.key -out dashboard.od.com.csr -subj "/CN=dashboard.od.com/C=CN/ST=BJ/L=Beijing/O=OldboyEdu/OU=ops"
    
    [root@hdss7-200 certs]#ls -l
    -rw------- 1 root root 1675 Nov 30 13:18 dashboard.od.com.key
    -rw-r--r-- 1 root root 1005 Nov 30 13:28 dashboard.od.com.csr
    
    setp3: x509签发证书
    [root@hdss7-200 certs]# openssl  x509 -req -in dashboard.od.com.csr -CA ca.pem -CAkey ca-key.pem  -CAcreateserial -out dashboard.od.com.crt -days 3650
    Signature ok
    subject=/CN=dashboard.od.com/C=CN/ST=BJ/L=Beijing/O=OldboyEdu/OU=ops
    Getting CA Private Key
    [root@hdss7-200 certs]#ls -l
    -rw-r--r-- 1 root root 1196 Nov 30 13:36 dashboard.od.com.crt
    -rw------- 1 root root 1675 Nov 30 13:18 dashboard.od.com.key
    -rw-r--r-- 1 root root 1005 Nov 30 13:28 dashboard.od.com.csr
    
    setp4:查看证书
    [root@hdss7-200 certs]# cfssl-certinfo -cert dashboard.od.com.crt
    

    2.4.4.2.cfssl签发证书

    setp1:找一个json文件然后修改域名
    [root@hdss7-200 certs]# cp client-csr.json  od.com-csr.json
    [root@hdss7-200 certs]# vi od.com-csr.json
    {
        "CN": "*.od.com",
        "hosts": [
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "ST": "beijing",
                "L": "beijing",
                "O": "od",
                "OU": "ops"
            }
        ]
    }
    setp2:签发
    [root@hdss7-200 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server od.com-csr.json |cfssl-json -bare od.com
    
    setp3:查看生成的证书
    [root@hdss7-200 certs]# ls -l
    -rw-r--r-- 1 root root  993 Nov 30 14:02 od.com.csr
    -rw-r--r-- 1 root root  280 Nov 30 13:58 od.com-csr.json
    -rw------- 1 root root 1679 Nov 30 14:02 od.com-key.pem
    -rw-r--r-- 1 root root 1363 Nov 30 14:02 od.com.pem
    

    2.4.4.3.拷贝证书

    hdss7-11上

    [root@hdss7-11 nginx]# ls
    conf.d     fastcgi.conf          fastcgi_params          koi-utf  mime.types          nginx.conf          scgi_params          uwsgi_params          win-utf
    default.d  fastcgi.conf.default  fastcgi_params.default  koi-win  mime.types.default  nginx.conf.default  scgi_params.default  uwsgi_params.default
    [root@hdss7-11 nginx]# mkdir certs
    [root@hdss7-11 nginx]# cd certs/
    [root@hdss7-11 certs]# scp hdss7-200:/opt/certs/od.com-key.pem   .
    [root@hdss7-11 certs]# scp hdss7-200:/opt/certs/od.com.pem   .
    

    2.4.4.4.创建nginx配置文件

    [root@hdss7-11 conf.d]# vi dashboard.od.com.conf
    server {
        listen       80;
        server_name  dashboard.od.com;
    
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    server {
        listen       443 ssl;
        server_name  dashboard.od.com;
    
        ssl_certificate "certs/od.com.pem";
        ssl_certificate_key "certs/od.com-key.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
    
        location / {
            proxy_pass http://default_backend_traefik;
            proxy_set_header Host       $http_host;
            proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        }
    }
    
    [root@hdss7-11 nginx]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@hdss7-11 nginx]# nginx -s reload
    

    2.4.4.5.浏览器访问

    2.4.4.5.1.windows 浏览器访问

    2.4.4.5.2.windows导出ca证书到windows桌面

    由于证书是自签的,所以需要ca导入本地浏览器

    [root@hdss7-200 certs]# sz ca.pem 
    
    2.4.4.5.3.windows改扩展名为crt并安装

    注意:此法新版浏览器失效

    2.4.4.6.找一个令牌进行测试

    [root@hdss7-21 conf]# kubectl get secret -n kube-system
    NAME                                     TYPE                                  DATA   AGE
    coredns-token-mhstl                      kubernetes.io/service-account-token   3      6d12h
    default-token-ntmvw                      kubernetes.io/service-account-token   3      13d
    kubernetes-dashboard-admin-token-ws4ck   kubernetes.io/service-account-token   3      4h9m
    kubernetes-dashboard-key-holder          Opaque                                2      3h25m
    traefik-ingress-controller-token-55b2f   kubernetes.io/service-account-token   3      6d10h
    
    [root@hdss7-21 conf]# kubectl describe secret kubernetes-dashboard-admin-token-ws4ck -n kube-system
    Name:         kubernetes-dashboard-admin-token-ws4ck
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard-admin
                  kubernetes.io/service-account.uid: 80808715-32d9-41b1-bd78-7ed7ab3af849
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    ca.crt:     1346 bytes
    namespace:  11 bytes
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbi10b2tlbi13czRjayIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjgwODA4NzE1LTMyZDktNDFiMS1iZDc4LTdlZDdhYjNhZjg0OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiJ9.xfboNXWurS7FEEOstO85MRElasKlvy-gapGLLHPJYHWjPi03gl5OAWXvDQuDJ9vXBrY33jsCkuCj0BgTFMKgXFuQANAaQ3pmg8Vs5_ViW19n4z5QI0E8jfV0rV_vqEz-lc5oXEHtnfGMkkkdr7PkVlZI4PpZgAE6oLjFAoKcmYgTy8Q32EYZf1VmhneB_OdHIw_bh_L1M_HRo9q3bSWESOWWVS68tmW0ZBHphd-Ntt5XqgkJygTYgKEtY-K8DtE_8anJOT0c4hvlc1PTwp1xmbyKwvJgxMuEXiTnPndgHA5rq-8LwuXs8pDc3llRDYVfCutr4ik9KqUSP-Md7Txfow
    

    粘贴token登陆

    2.4.5.部署heapster(官方今后废弃)

    2.4.5.1.准备heapster镜像(需要kexue上网)

    [root@hdss7-200 certs]# docker pull quay.io/bitnami/heapster:1.5.4
    [root@hdss7-200 src]# docker tag c359b95ad38b harbor.od.com/public/heapster:v1.5.4
    [root@hdss7-200 src]# docker push  harbor.od.com/public/heapster:v1.5.4
    

    2.4.5.2.准备资源配置清单

    hdss7-200上

    [root@hdss7-200 k8s-yaml]# mkdir -p /data/k8s-yaml/dashboard/heapster
    [root@hdss7-200 k8s-yaml]# cd dashboard/heapster/
    [root@hdss7-200 heapster]# vi rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: heapster
      namespace: kube-system
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: heapster
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:heapster
    subjects:
    - kind: ServiceAccount
      name: heapster
      namespace: kube-system
      
    [root@hdss7-200 heapster]# vi dp.yaml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: heapster
      namespace: kube-system
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            task: monitoring
            k8s-app: heapster
        spec:
          serviceAccountName: heapster
          containers:
          - name: heapster
            image: harbor.od.com/public/heapster:v1.5.4
            imagePullPolicy: IfNotPresent
            command:
            - /opt/bitnami/heapster/bin/heapster
            - --source=kubernetes:https://kubernetes.default
            
    [root@hdss7-200 heapster]# vi svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        task: monitoring
        # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
        # If you are NOT using this as an addon, you should comment out this line.
        kubernetes.io/cluster-service: 'true'
        kubernetes.io/name: Heapster
      name: heapster
      namespace: kube-system
    spec:
      ports:
      - port: 80
        targetPort: 8082
      selector:
        k8s-app: heapster
    

    2.4.5.3.应用资源配置清单

    任意运算节点上

    [root@hdss7-21 conf]# kubectl apply -f http://k8s-yaml.od.com/dashboard/heapster/rbac.yaml
    serviceaccount/heapster created
    clusterrolebinding.rbac.authorization.k8s.io/heapster created
    
    [root@hdss7-21 conf]# kubectl apply -f http://k8s-yaml.od.com/dashboard/heapster/dp.yaml
    deployment.extensions/heapster created
    
    [root@hdss7-21 conf]# kubectl apply -f http://k8s-yaml.od.com/dashboard/heapster/svc.yaml
    service/heapster created
    

    查看:

    [root@hdss7-21 conf]# kubectl get pods -n kube-system
    NAME                                    READY   STATUS    RESTARTS   AGE
    coredns-6b6c4f9648-7mr4w                1/1     Running   0          3h55m
    heapster-b5b9f794-gz6mf                 1/1     Running   0          68s
    kubernetes-dashboard-76dcdb4677-kncnz   1/1     Running   0          3h58m
    traefik-ingress-jsrcs                   1/1     Running   0          29h
    traefik-ingress-v4qxh                   1/1     Running   0          29h
    

    2.4.5.4.重启dashboard(图表仅供参考)

    3.K8S集群平滑回退或升级

    注意:生产根据业务来规划升级时间,这里以hdss7-21为例

    3.1.环境描述

    可以看到我们集群现在是v1.15.2版本,我们要升级v1.15.4版本

    [root@hdss7-21 conf]# kubectl get node
    NAME                STATUS   ROLES         AGE   VERSION
    hdss7-21.host.com   Ready    master,node   13d   v1.15.2
    hdss7-22.host.com   Ready    master,node   13d   v1.15.2
    

    3.2.下线升级的节点

    修改nginx.conf,把此节点注释掉,此处略。。。
    删除节点之前可以看到两个节点,pod随机运行在21.22两个节点上

    [root@hdss7-21 conf]# kubectl get node
    NAME                STATUS   ROLES         AGE   VERSION
    hdss7-21.host.com   Ready    master,node   13d   v1.15.2
    hdss7-22.host.com   Ready    master,node   13d   v1.15.2
    [root@hdss7-21 conf]# kubectl get pod -n kube-system -o wide
    NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    coredns-6b6c4f9648-7mr4w                1/1     Running   0          4h7m    172.7.22.6   hdss7-22.host.com   <none>           <none>
    heapster-b5b9f794-gz6mf                 1/1     Running   0          13m     172.7.21.4   hdss7-21.host.com   <none>           <none>
    kubernetes-dashboard-76dcdb4677-kncnz   1/1     Running   0          4h11m   172.7.22.5   hdss7-22.host.com   <none>           <none>
    traefik-ingress-jsrcs                   1/1     Running   0          29h     172.7.21.5   hdss7-21.host.com   <none>           <none>
    traefik-ingress-v4qxh                   1/1     Running   0          29h     172.7.22.4   hdss7-22.host.com   <none>           <none>
    

    删除节点之后,可以看到只剩一个节点,pod全部调度到hdss7-22节点上

    [root@hdss7-21 conf]# kubectl delete node hdss7-21.host.com
    node "hdss7-21.host.com" deleted
    
    [root@hdss7-21 conf]# kubectl get node
    NAME                STATUS   ROLES         AGE   VERSION
    hdss7-22.host.com   Ready    master,node   13d   v1.15.2
    
    [root@hdss7-21 conf]# kubectl get pod -n kube-system -o wide
    NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    coredns-6b6c4f9648-7mr4w                1/1     Running   0          4h8m    172.7.22.6   hdss7-22.host.com   <none>           <none>
    heapster-b5b9f794-h84z9                 1/1     Running   0          24s     172.7.22.8   hdss7-22.host.com   <none>           <none>
    kubernetes-dashboard-76dcdb4677-kncnz   1/1     Running   0          4h12m   172.7.22.5   hdss7-22.host.com   <none>           <none>
    traefik-ingress-v4qxh                   1/1     Running   0          29h     172.7.22.4   hdss7-22.host.com   <none>           <none>
    
    [root@hdss7-21 conf]# dig -t A kubernetes.default.svc.cluster.local @192.168.0.2 +short         //可以看到集群内的服务根本不受影响
    192.168.0.1
    

    3.3.解压,改名,创建软链接

    解压:
    [root@hdss7-21 opt]# mkdir 123
    [root@hdss7-21 opt]# cd src/
    [root@hdss7-21 src]# tar xfv kubernetes-server-linux-amd64-v1.15.4.tar.gz  -C /opt/123/
    改名:
    [root@hdss7-21 src]# cd ../123/
    [root@hdss7-21 123]# mv kubernetes/  ../kubernetes-v1.15.4
    [root@hdss7-21 opt]# rm -rf 123/
    软链接:
    [root@hdss7-21 opt]# ll
    lrwxrwxrwx 1 root root   24 Nov 17 01:35 kubernetes -> /opt/kubernetes-v1.15.2/
    drwxr-xr-x 4 root root   50 Nov 17 01:37 kubernetes-v1.15.2
    drwxr-xr-x 4 root root   79 Sep 18 23:09 kubernetes-v1.15.4
     [root@hdss7-21 opt]# rm -f kubernetes           
    [root@hdss7-21 opt]# ln -s /opt/kubernetes-v1.15.4/ /opt/kubernetes
    [root@hdss7-21 opt]# ll
    total 4
    
    lrwxrwxrwx 1 root root   24 Nov 17 01:35 kubernetes -> /opt/kubernetes-v1.15.4/
    drwxr-xr-x 4 root root   76 Nov 30 16:07 kubernetes-v1.15.2
    drwxr-xr-x 4 root root   79 Sep 18 23:09 kubernetes-v1.15.4
    drwxr-xr-x 2 root root 4096 Nov 23 21:26 src
    
    删除无用的文件:
    [root@hdss7-21 opt]# cd kubernetes
    [root@hdss7-21 kubernetes]# ls
    addons  kubernetes-src.tar.gz  LICENSES  server
    [root@hdss7-21 kubernetes]# rm -f kubernetes-src.tar.gz 
    [root@hdss7-21 kubernetes]# cd server/bin/
    
    [root@hdss7-21 bin]# rm -fr *.tar
    [root@hdss7-21 bin]# rm -fr *_tag
    

    3.4.拷贝conf文件和cert文件和sh脚本

    [root@hdss7-21 bin]# mkdir conf
    [root@hdss7-21 bin]# mkdir cert
    [root@hdss7-21 bin]# cp /opt/kubernetes-v1.15.2/server/bin/cert/* ./cert/
    [root@hdss7-21 bin]# cp /opt/kubernetes-v1.15.2/server/bin/conf/* ./conf/
    [root@hdss7-21 bin]# cp /opt/kubernetes-v1.15.2/server/bin/*.sh  .
    

    3.5.重启服务并检查

    注意:生产上要一个一个重启,etcd,flannel不需要重启

    [root@hdss7-21 bin]# supervisorctl restart all
    [root@hdss7-21 bin]# supervisorctl status
    etcd-server-7-21                 RUNNING   pid 9595, uptime 0:04:40
    flanneld-7-21                    RUNNING   pid 12236, uptime 0:00:35
    kube-apiserver-7-21              RUNNING   pid 9655, uptime 0:04:40
    kube-controller-manager-7-21     RUNNING   pid 9671, uptime 0:04:40
    kube-kubelet-7-21                RUNNING   pid 11628, uptime 0:01:55
    kube-proxy-7-21                  RUNNING   pid 9691, uptime 0:04:40
    kube-scheduler-7-21              RUNNING   pid 9706, uptime 0:04:40
    
    [root@hdss7-21 bin]# kubectl get nodes
    NAME                STATUS   ROLES         AGE     VERSION
    hdss7-21.host.com   Ready    <none>        7m26s   v1.15.4
    hdss7-22.host.com   Ready    master,node   13d     v1.15.2
    
    [root@hdss7-21 bin]# kubectl get pods -n kube-system -o wide 
    NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
    coredns-6b6c4f9648-7mr4w                1/1     Running   0          4h46m   172.7.22.6   hdss7-22.host.com   <none>           <none>
    heapster-b5b9f794-h84z9                 1/1     Running   0          37m     172.7.22.8   hdss7-22.host.com   <none>           <none>
    kubernetes-dashboard-76dcdb4677-kncnz   1/1     Running   0          4h50m   172.7.22.5   hdss7-22.host.com   <none>           <none>
    traefik-ingress-6jgm6                   1/1     Running   0          8m52s   172.7.21.2   hdss7-21.host.com   <none>           <none>
    traefik-ingress-v4qxh                   1/1     Running   0          30h     172.7.22.4   hdss7-22.host.com   <none>           <none>
    
  • 相关阅读:
    数据结构 -- 栈(一)
    数据结构 -- 栈(二)
    Linux 静态库 & 动态库
    Python及Pycharm安装详细教程
    Makefile研究(三) —— 实际应用
    Makefile研究(二)—— 完整可移植性模板
    Makefile研究 (一)—— 必备语法
    JSON 下 -- jansson 示例
    C语言中的static 详细分析
    Linux 命令 -- tar
  • 原文地址:https://www.cnblogs.com/wangchaolinux/p/11921202.html
Copyright © 2020-2023  润新知