部署规划
内存资源有限,方便实验,三个节点既做master又做运算节点,生产master节点和node节点分开部署
192.168.30.90 k8s-master-1    
192.168.30.91 k8s-master-2
192.168.30.92 k8s-master-3

1.集群各节点安装chrony时间服务,确保各节点的时间同步

1)将集群中k8s-master-1设置为时间同步服务,主要修改以下三处配置

二进制手动部署kubernetes集群-k8s-1.17.9

2)其他节点均指定时间服务为此节点,然后重启各节点的chronyd服务(systemctl restart chronyd),时间将立即同步

二进制手动部署kubernetes集群-k8s-1.17.9

2.各节点部署docker-ce

1)安装docker-ce

方法一:

    配置docker-ce社区版的yum源
    [root@k8s-master-1 ~]# vim /etc/yum.repos.d/docker-ce.repo
    [docker-ce]
    name=docker-ce
    baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
    gpgcheck=0
    enabled=1
    列出docker-ce的所有版本,安装所需的版本
    [root@k8s-master-1 yum.repos.d]# yum list docker-ce --showduplicates

二进制手动部署kubernetes集群-k8s-1.17.9

        这里安装1809版本
        [root@k8s-master-1 yum.repos.d]# yum install docker-ce-18.09.9-3.el7 -y

方法二:

    curl  -fsSL  https://get.docker.com | bash -s docker --mirror Aliyun  #一条命令直接添加yum源并默认安装最新版docke-ce

2)手动创建docker配置文件

    [root@k8s-master-1 ~]# mkdir /etc/docker/ -pv
    [root@k8s-master-1 ~]# vim /etc/docker/daemon.json

二进制手动部署kubernetes集群-k8s-1.17.9

3)启动docker服务

    [root@k8s-master-1 ~]# systemctl daemon-reload
    [root@k8s-master-1 ~]# systemctl start docker
    [root@k8s-master-1 ~]# systemctl enable docker

二进制手动部署kubernetes集群-k8s-1.17.9

4)查看docker服务是否启动

    [root@k8s-master-1 ~]# ps -ef | grep docker #查看启动的docker进程

二进制手动部署kubernetes集群-k8s-1.17.9

    [root@k8s-master-1 ~]# ip a #查看docker0桥

二进制手动部署kubernetes集群-k8s-1.17.9

    [root@k8s-master-1 ~]# docker info 启动后的属性信息查看

二进制手动部署kubernetes集群-k8s-1.17.9

    [root@k8s-master-1 ~]# ll /data/docker/  启动生成的docker数据

二进制手动部署kubernetes集群-k8s-1.17.9

3.下载证书签发工具cfssl,用于签发集群证书

1)官网下载证书签发工具,-O输出指定下载的路径

 [root@k8s-master-1 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
 [root@k8s-master-1 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json  
 [root@k8s-master-1 ~]# chmod +x /usr/bin/cfssl* #添加执行权限

2)生成自签CA证书

[root@k8s-master-1 ~]# mkdir /certs  #创建证书签发目录,专用于证书存放或签发
[root@k8s-master-1 certs]# cfssl print-defaults csr > ca-csr.json #通过命令生成CA证书申请文件ca-csr.json模板
[root@k8s-master-1 certs]# vim ca-csr.json  #修改模板文件为如下,自定义CA申请文件

二进制手动部署kubernetes集群-k8s-1.17.9
l
[root@k8s-master-1 certs]# cfssl gencert -initca ca-csr.json | cfssl-json -bare ca #通过申请文件初始化自签发CA证书,-bare表示生成承载式证书
二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 certs]# ll #查看生成的证书和证书私钥,生成的其他文件可直接删除掉,无用

二进制手动部署kubernetes集群-k8s-1.17.9

4.部署ETCD集群数据库,存储k8s集群中所有数据

1).签发etcd集群通信证书

生成ca证书的签发的配置文件
[root@k8s-master-1 certs]# cfssl print-defaults config > ca-config.json  
编辑ca配置文件,指定签署证书的类型,修改成如下
[root@k8s-master-1 certs]# vim ca-config.json 

二进制手动部署kubernetes集群-k8s-1.17.9

    创建etcd证书申请文件
    [root@k8s-master-1 certs]# vim etcd-peer-csr.json 

二进制手动部署kubernetes集群-k8s-1.17.9

    通过etcd申请文件来签发生成etcd证书,-ca:指定根证书 -ca-key:指定ca证书私钥  -config:ca配置  -profile:定义签发的证书类型
    [root@k8s-master-1 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | cfssl-json -bare etcd-peer    

二进制手动部署kubernetes集群-k8s-1.17.9

    查看颁发生成的证书文件
    [root@k8s-master-1 certs]# ll etcd-peer*

二进制手动部署kubernetes集群-k8s-1.17.9

2).github下载etcd二进制包并解压

    访问https://github.com/etcd-io/etcd/releases,3.3版本可能不稳定,以3.2版本为例,找到3.2.30版本资产下载etcd,再通过curl命令或wget命令下载

    [root@k8s-master-1 ~]# curl -L https://github.com/etcd-io/etcd/releases/download/v3.2.30/etcd-v3.2.30-linux-amd64.tar.gz -o /tmp/etcd-v3.2.30-linux-amd64.tar.gz

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# mkdir /kubernetes -pv #创建集群部署目录
[root@k8s-master-1 kubernetes]# tar xvf /tmp/etcd-v3.2.30-linux-amd64.tar.gz -C /kubernetes/ #解压到此目录
[root@k8s-master-1 kubernetes]# ll #查看解压后的目录

二进制手动部署kubernetes集群-k8s-1.17.9

        [root@k8s-master-1 kubernetes]# ln -sv /kubernetes/etcd-v3.2.30-linux-amd64/ /kubernetes/etcd  #创建软连接,方便后面的升级

二进制手动部署kubernetes集群-k8s-1.17.9

            [root@k8s-master-1 kubernetes]# ls etcd  #查看etcd的二进制文件

二进制手动部署kubernetes集群-k8s-1.17.9

3).配置master-1节点的etcd服务

创建etcd服务的启动脚本
[root@k8s-master-1 ~]# vim /kubernetes/etcd/etcd-start.sh 

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# chmod +x /kubernetes/etcd/etcd-start.sh  #加上执行权限
创建etcd启动脚本所需的目录和必要的文件
[root@k8s-master-1 ~]# mkdir /kubernetes/etcd/certs -p  #存放etcd证书
[root@k8s-master-1 ~]# cp /certs/{etcd-peer-key.pem,etcd-peer.pem,ca.pem} /kubernetes/etcd/certs/   #复制相关的证书文件到此目录下
[root@k8s-master-1 ~]# ll /kubernetes/etcd/certs/

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# mkdir /data/etcd/etcd-server -p   #etcd数据存储目录

4).将此节点的etcd服务所有相关配置及程序等拷贝至另外两个etcd节点,并修改各节点的etcd启动脚本中的节点ip地址

远程复制至两etcd节点
[root@k8s-master-1 ~]# scp -r /kubernetes/ k8s-master-2:/
[root@k8s-master-1 ~]# scp -r /kubernetes/ k8s-master-3:/
创建另外两节点etcd数据存储目录
[root@k8s-master-2 ~]#  mkdir /data/etcd/etcd-server -p  
[root@k8s-master-3 ~]#  mkdir /data/etcd/etcd-server -p 

5).三个etcd节点均配置完后,同时启各节点的etcd服务

[root@k8s-master-1 ~]# cd /kubernetes/etcd && nohup ./etcd-start.sh &> /kubernetes/etcd/etcd.out & #各节点执行启动命令
[root@k8s-master-1 ~]# ps -ef | grep etcd | grep -v grep #查看服务进程是否启动

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# /kubernetes/etcd/etcdctl cluster-health  #检查集群健康状态

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# /kubernetes/etcd/etcdctl member list    #列出集群中的etcd节点成员,到此etcd集群已经部署成功

二进制手动部署kubernetes集群-k8s-1.17.9

5.部署集群访问接口apiserver,用于实现集群内外部通信

1)签发apiserver两套证书

client证书签发,api需通过client证书访问etcd集群

[root@k8s-master-1 certs]# vim client-csr.json  #创建client证书申请文件

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssl-json -bare client  #签发client证书
[root@k8s-master-1 certs]# ll client*  #查看生成的client证书相关文件

二进制手动部署kubernetes集群-k8s-1.17.9

apiserver服务端的证书签发,此时apiserver作为一个服务端,被其他客户端访问

[root@k8s-master-1 certs]# vim apiserver-csr.json  #创建apiserver服务端证书申请文件,必须指定所有作为server端的api地址,否则导致集群间无法通信

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server apiserver-csr.json | cfssl-json -bare apiserver #签发apiserver证书
[root@k8s-master-1 certs]# ll apiserver* #查看签发生成的api证书相关文件

二进制手动部署kubernetes集群-k8s-1.17.9

2)GitHub获取k8s的二进制压缩包文件

查看k8s二进制包的版本,不推荐最新版,选择一个较稳定版

二进制手动部署kubernetes集群-k8s-1.17.9

点击进入,下载server端二进制包

二进制手动部署kubernetes集群-k8s-1.17.9

选择server端linux-amd平台进行下载
[root@k8s-master-1 ~]# wget https://dl.k8s.io/v1.17.9/kubernetes-server-linux-amd64.tar.gz -O /tmp/kubernetes-1.17.9-server-linux-amd64.tar.gz  #下载1.17.9版本二进制包

二进制手动部署kubernetes集群-k8s-1.17.9

    解压二进制压缩包
    [root@k8s-master-1 tmp]# tar xvf kubernetes-1.17.9-server-linux-amd64.tar.gz
    查看解压后目录下的二进制程序
    [root@k8s-master-1 ~]# ll /tmp/kubernetes/server/bin/

二进制手动部署kubernetes集群-k8s-1.17.9

    创建一个存放k8s二进制文件路径
    [root@k8s-master-1 ~]# mkdir /kubernetes/bin -pv
    将用到的二进制程序复制到此目录下
    [root@k8s-master-1 ~]# cp /tmp/kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kubelet,kube-proxy} /kubernetes/bin/
    查看需要用到的二进制程序
    [root@k8s-master-1 ~]# ll /kubernetes/bin/

二进制手动部署kubernetes集群-k8s-1.17.9

3)创建apiserver服务的启动脚本及审计日志配置文件

[root@k8s-master-1 ~]# vim /kubernetes/bin/apiserver.sh   

二进制手动部署kubernetes集群-k8s-1.17.9

脚本加上执行权限
[root@k8s-master-1 ~]# chmod +x /kubernetes/bin/apiserver.sh 
创建脚本中指定的日志输出保存的路径
[root@k8s-master-1 ~]# mkdir -pv /data/logs/kubernetes/kube-apiserver/
根据脚本创建相应的证书目录,配置目录
[root@k8s-master-1 ~]# mkdir /kubernetes/bin/{conf,cert}
复制签发所需要的所有证书文件
cp /certs/{client.pem,client-key.pem,ca.pem,ca-key.pem,apiserver.pem,apiserver-key.pem} /kubernetes/bin/cert/
创建日志审计配置文件,定义资源信息获取规则
[root@k8s-master-1 ~]# vim /kubernetes/bin/conf/audit.yaml
apiVersion: audit.k8s.io/v1beta1
kind: Policy
omitStages:
    - "RequestReceived"
rules:
    - level: RequestResponse
        resources:
        - group: "" 
            resources: ["pods"]
    - level: Metadata
        resources:
        - group: "" 
            resources: ["pods/log","pods/status"]
    - level: None
        resources:
        - group: "" 
            resources: ["configmaps"] 
            resourceNames: ["controller-leader"]
    - level: None
        users: ["system:kube-proxy"]
        verbs: ["watch"]
        resources:
        - group: "" 
            resources: ["endpoints","services"] 
    - level: None
        userGroups: ["system:authenticated"]
        nonResourceURLs:
        - "/api*"
        - "/version"
    - level: Request
        resources:
        - group: "" 
            resources: ["configmap"]
        namespaces: ["kube-system"]
    - level: Metadata
        resources:
        - group: "" 
            resources: ["secrets","configmaps"]
    - level: Request
        resources:
        - group: ""
        - group: "extensions"
    - level: Metadata
        omitStages:
            - "RequestReceived"

4)将apiserver相关的配置文件、二进制程序、脚本复制到master-2和master-3节点,在分别启动三个master节点的apiserver服务

相关文件拷贝至远程节点
[root@k8s-master-1 ~]# scp -r /kubernetes/bin/ 192.168.30.91:/kubernetes/
[root@k8s-master-1 ~]# scp -r /kubernetes/bin/ 192.168.30.92:/kubernetes/
启动apiserver服务,各节点执行以下相同的启动命令
[root@k8s-master-1 ~]# cd /kubernetes/bin && nohup ./apiserver.sh &> /data/logs/kubernetes/kube-apiserver/apiserver.out &
查看apiserver启动进程,同样在各节点查看
[root@k8s-master-1 ~]# ps -ef | grep apiserver | grep -v grep 

二进制手动部署kubernetes集群-k8s-1.17.9

创建kubectl软链接
[root@k8s-master-1 ~]# ln -sv /kubernetes/bin/kubectl /usr/bin/

二进制手动部署kubernetes集群-k8s-1.17.9

在通过kubectl查看集群组件健康状态,controller和scheduler因还未部署,因此显示不健康状态;各节点依次查看健康状态
[root@k8s-master-1 ~]# kubectl get cs

二进制手动部署kubernetes集群-k8s-1.17.9

6.部署controller-manager控制器

主控制器可直接访问本地监听8080端口的apiserevr,因此无需签发证书,直接创建启动脚本;各节点控制器启动脚本均相同无需更改
[root@k8s-master-1 ~]# vim /kubernetes/bin/kube-controll-manager.sh

二进制手动部署kubernetes集群-k8s-1.17.9

添加执行权限
[root@k8s-master-1 ~]# chmod +x /kubernetes/bin/kube-controll-manager.sh
创建控制器日志输出保存路径
[root@k8s-master-1 ~]# mkdir -pv /data/logs/kubernetes/kube-controller-manager
各节点依次执行控制器脚本,启动controller-manager主控制器
[root@k8s-master-1 ~]# cd /kubernetes/bin && nohup ./kube-controll-manager.sh &> /data/logs/kubernetes/kube-controller-manager/controller-manager.out &
再次查看集群组件健康状态,控制器已成功启动
[root@k8s-master-1 ~]# kubectl get cs

二进制手动部署kubernetes集群-k8s-1.17.9

7.部署scheduler资源调度器

scheduler调度器同样无需签发证书,可直接访问本地的8080监听的api端口,如下是启动脚本,更加简洁

二进制手动部署kubernetes集群-k8s-1.17.9

添加执行权限
[root@k8s-master-1 ~]# chmod +x /kubernetes/bin/kube-scheduler.sh
创建日志输出的路径
[root@k8s-master-1 ~]# mkdir -pv /data/logs/kubernetes/kube-scheduler
各节点执行以下启动命令
[root@k8s-master-1 ~]# cd /kubernetes/bin && nohup ./kube-scheduler.sh &> /data/logs/kubernetes/kube-scheduler/kube-scheduler.out &
 查看你调度器健康状态,可见以成功启动
[root@k8s-master-1 ~]# kubectl get cs

二进制手动部署kubernetes集群-k8s-1.17.9

8.部署kubelet,专用于管理维护pod健康状态,是真正干活的、最关键的组件

1)签发kubelet的server端证书

创建kubelet证书申请文件,指定所有node节点
[root@k8s-master-1 certs]# vim kubelet-csr.json

二进制手动部署kubernetes集群-k8s-1.17.9

签发证书
[root@k8s-master-1 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json | cfssl-json -bare kubelet
查看签发生成的证书文件
[root@k8s-master-1 certs]# ll kubelet*

二进制手动部署kubernetes集群-k8s-1.17.9

拷贝生成的证书至指定的证书目录下
[root@k8s-master-1 ~]# cp /certs/{kubelet.pem,kubelet-key.pem}  /kubernetes/bin/cert/

2)创建kubelet的客户端认证配置文件kubeconfig

通过CA证书创建一个k8s集群
root@k8s-master-1 ~]# kubectl config set-cluster k8s-cluster --certificate-authority=/kubernetes/bin/cert/ca.pem --server=https://192.168.30.90:6443 --embed-certs=true --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

查看创建的集群
[root@k8s-master-1 ~]# kubectl config view --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

添加kubelet认证用户至users表中,kubelet与apiserver共用同一client证书,因此无需单独签发kubelet客户端证书
[root@k8s-master-1 ~]# kubectl config set-credentials k8s-client --client-certificate=/kubernetes/bin/cert/client.pem --client-key=/kubernetes/bin/cert/client-key.pem --embed-certs=true  --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

创建context集群上下文件,允许kubelet用户访问该集群
[root@k8s-master-1 ~]# kubectl config set-context k8s-context --cluster=k8s-cluster --user=k8s-client --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

切换使用当前上下文为k8s-context
[root@k8s-master-1 ~]# kubectl config use-context k8s-context --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

再次查看创建的集群
[root@k8s-master-1 ~]# kubectl config view --kubeconfig=/kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

最终生成的kubeconfig配置文件,里面定义了信任的ca根证书、客户端证书和私钥、集群认证用户、安全上下文等属性信息
[root@k8s-master-1 ~]# vim /kubernetes/bin/conf/kubelet.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

3)创建kubelet启动脚本

[root@k8s-master-1 ~]# vim /kubernetes/bin/kubelet.sh

二进制手动部署kubernetes集群-k8s-1.17.9

添加脚本执行权限
[root@k8s-master-1 ~]# chmod +x /kubernetes/bin/kubelet.sh
创建kubelet数据存储目录
[root@k8s-master-1 ~]# mkdir  /data/kubelet
创建kubelet日志存储路径
[root@k8s-master-1 ~]# mkdir -p /data/logs/kubernetes/kube-kubelet

4)将以上kubelet相关配置、脚本拷贝至master-2和master-3两个节点

kubelet认证证书
[root@k8s-master-1 ~]# scp /kubernetes/bin/cert/{kubelet.pem,kubelet-key.pem} k8s-master-2:/kubernetes/bin/cert/
[root@k8s-master-1 ~]# scp /kubernetes/bin/cert/{kubelet.pem,kubelet-key.pem} k8s-master-3:/kubernetes/bin/cert/
kubelet访问集群的客户端配置文件kubecnfig
[root@k8s-master-1 ~]# scp /kubernetes/bin/conf/kubelet.kubeconfig k8s-master-2:/kubernetes/bin/conf/
[root@k8s-master-1 ~]# scp /kubernetes/bin/conf/kubelet.kubeconfig k8s-master-3:/kubernetes/bin/conf/

kubelet的启动脚本
[root@k8s-master-1 ~]# scp /kubernetes/bin/kubelet.sh k8s-master-2:/kubernetes/bin/    #修改启动脚本中的主机名为k8s-master-2
[root@k8s-master-1 ~]# scp /kubernetes/bin/kubelet.sh k8s-master-3:/kubernetes/bin/ #修改启动脚本中的主机名为k8s-master-3

5)给kubelet用户绑定一个集群角色,使得kubelet能够访问pod、node等集群资源

创建一个clusterrolebinding
[root@k8s-master-1 ~]# vim /tmp/k8s-node-clusterrole.yaml

二进制手动部署kubernetes集群-k8s-1.17.9

[root@k8s-master-1 ~]# kubectl apply -f /tmp/k8s-node-clusterrole.yaml

二进制手动部署kubernetes集群-k8s-1.17.9

查看创建的clusterrolebinding,可见以成功创建此集群角色绑定资源
[root@k8s-master-1 ~]# kubectl get clusterrolebinding

二进制手动部署kubernetes集群-k8s-1.17.9

6)最后依次启动各节点的kubelet服务

先试着启动master-1节点kubelet服务
[root@k8s-master-1 ~]# cd /kubernetes/bin && nohup ./kubelet.sh &> /data/logs/kubernetes/kube-kubelet/kubelet.out &  
只看到master-1单个节点处于ready状态,因master-2和master-3还未启动kubelet服务
[root@k8s-master-1 ~]# kubectl get node

二进制手动部署kubernetes集群-k8s-1.17.9

master-2和master-3均启动kubelet服务后,再次查看节点状态,此时所有节点均已成功添加到集群处于就绪状态
[root@k8s-master-1 ~]# kubectl get node

二进制手动部署kubernetes集群-k8s-1.17.9

7)给各节点打上角色标签

给master-1打上master角色标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-1 node-role.kubernetes.io/master=
查看已经打好的标签
[root@k8s-master-1 ~]# kubectl get node

二进制手动部署kubernetes集群-k8s-1.17.9

这里就不区分master节点和node节点,全部打上master和node的标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-1 node-role.kubernetes.io/node=  #打上node标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-2 node-role.kubernetes.io/node=  #打上node标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-3 node-role.kubernetes.io/node= #打上node标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-3 node-role.kubernetes.io/master=  #打上master标签
[root@k8s-master-1 ~]# kubectl label node k8s-master-2 node-role.kubernetes.io/master= #打上master标签
查看打号的集群节点角色标签
[root@k8s-master-1 ~]# kubectl get node

二进制手动部署kubernetes集群-k8s-1.17.9

9.部署kube-proxy,主要实现service与pod间的iptables调度或ipvs调度、即pod与集群间通信

1)签发kube-proxy访问集群的专用客户端证书

创建kube-proxy的证书申请文件
[root@k8s-master-1 certs]# vim kube-proxy-csr.json

二进制手动部署kubernetes集群-k8s-1.17.9

签发kube-proxy证书
[root@k8s-master-1 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssl-json -bare kube-proxy-client
查看签发生成的证书
[root@k8s-master-1 certs]# ll kube-proxy*

二进制手动部署kubernetes集群-k8s-1.17.9

生成的签发证书放到只当路径
[root@k8s-master-1 ~]# cp /certs/{kube-proxy-client.pem,kube-proxy-client-key.pem} /kubernetes/bin/cert

2)创建kube-proxy的客户端认证配置文件kubeconfig

创建一各集群
[root@k8s-master-1 ~]# kubectl config set-cluster my-k8s --certificate-authority=/kubernetes/bin/cert/ca.pem --server=https://192.168.30.91:6443 --embed-certs=true --kubeconfig=/kubernetes/bin/conf/kube-proxy.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

添加kube-proxy认证用户到users列表
[root@k8s-master-1 ~]# kubectl config set-credentials kube-proxy --client-certificate=/kubernetes/bin/cert/kube-proxy-client.pem --client-key=/kubernetes/bin/cert/kube-proxy-client-key.pem --embed-certs=true --kubeconfig=/kubernetes/bin/conf/kube-proxy.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

创建context上下文
[root@k8s-master-1 ~]# kubectl config set-context proxy-context --cluster=my-k8s --user=kube-proxy --kubeconfig=/kubernetes/bin/conf/kube-proxy.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

切换当前上下文
[root@k8s-master-1 ~]# kubectl config use-context proxy-context --kubeconfig=/kubernetes/bin/conf/kube-proxy.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

查看创建好的kube-proxy的集群信息
[root@k8s-master-1 ~]# kubectl config view --kubeconfig=/kubernetes/bin/conf/kube-proxy.kubeconfig

二进制手动部署kubernetes集群-k8s-1.17.9

3)编辑kube-proxy的启动脚本,即相关配置

    创建kube-proxy的启动脚本
    [root@k8s-master-1 ~]# vim /kubernetes/bin/kube-proxy.sh

二进制手动部署kubernetes集群-k8s-1.17.9

    添加执行权限
    [root@k8s-master-1 ~]# chmod +x  /kubernetes/bin/kube-proxy.sh
    创建kube-proxy的日志输出路径,同样在master-2和master-3等节点创建
    [root@k8s-master-1 ~]# mkdir -p /data/logs/kubernetes/kube-proxy
    查看ipvs模块是否启动,默认是没有启动,必须启动ipvs调度模块,否者kube-proxy所选的ipvs调度无法生效
    [root@k8s-master-1 ~]# lsmod | grep ip_vs  #命令查看未返回任何结果,说明未启动ipvs模块

二进制手动部署kubernetes集群-k8s-1.17.9

    编辑ipvs功能模块启动的脚本
    [root@k8s-master-1 ~]# vim /kubernetes/bin/ipvs_model.sh

二进制手动部署kubernetes集群-k8s-1.17.9

    添加执行权限
    [root@k8s-master-1 ~]# chmod +x /kubernetes/bin/ipvs_model.sh
    执行ipvs模块启动脚本
    [root@k8s-master-1 ~]# bash /kubernetes/bin/ipvs_model.sh
    再次查看ipvs模块,可见已经启用ipvs模块调度功能,同时在其他节点也启用ipvs模块
    [root@k8s-master-1 ~]# lsmod | grep ip_vs

二进制手动部署kubernetes集群-k8s-1.17.9

4)此时将kube-proxy相关文件全部拷贝到master-2、master-3等节点

复制证书文件
[root@k8s-master-1 ~]# scp /kubernetes/bin/cert/{kube-proxy-client.pem,kube-proxy-client-key.pem} k8s-master-2:/kubernetes/bin/cert/
[root@k8s-master-1 ~]# scp /kubernetes/bin/cert/{kube-proxy-client.pem,kube-proxy-client-key.pem} k8s-master-3:/kubernetes/bin/cert/
复制kubeconfig客户端认证配置文件
[root@k8s-master-1 ~]# scp /kubernetes/bin/conf/kube-proxy.kubeconfig k8s-master-2:/kubernetes/bin/conf/   
[root@k8s-master-1 ~]# scp /kubernetes/bin/conf/kube-proxy.kubeconfig k8s-master-3:/kubernetes/bin/conf/   
复制kube-proxy的启动脚本及ipvs模块启动脚本
[root@k8s-master-1 ~]# scp /kubernetes/bin/{kube-proxy.sh,ipvs_model.sh} k8s-master-2:/kubernetes/bin/  #启动脚本主机名修改为k8s-master-2
[root@k8s-master-1 ~]# scp /kubernetes/bin/{kube-proxy.sh,ipvs_model.sh} k8s-master-3:/kubernetes/bin/  #启动脚本主机名修改为k8s-master-3

5)完成上面操作后,开始启动各节点的kube-proxy服务

先不启动kube-proxy服务组件,试着来部署一个nginx的pod应用

编辑nginx应用的yaml文件
[root@k8s-master-1 ~]# vim /tmp/nginx.yaml

二进制手动部署kubernetes集群-k8s-1.17.9

apply声明式创建一个受deployment控制器管理的nginx应用
[root@k8s-master-1 ~]# kubectl apply -f /tmp/nginx.yaml

二进制手动部署kubernetes集群-k8s-1.17.9

查看nginx的deplotyment、service、pod均已成功创建

二进制手动部署kubernetes集群-k8s-1.17.9

查看pod应用具体运行在哪个节点
[root@k8s-master-1 ~]# kubectl get pod -o wide

二进制手动部署kubernetes集群-k8s-1.17.9

切换到master-2节点,直接访问pod应用;为什么要切换到master-2机器,因没有装flannel或calico等网络插件,此时跨节点访问pod是无法访问
[root@k8s-master-2 ~]# curl 172.7.22.2 #可见是直接能访问到pod

二进制手动部署kubernetes集群-k8s-1.17.9

若直接访问service的ip,通过service调度到pod,如下会一直卡住无法访问,就是因为没启动kube-proxy服务,导致service无法实现调度功能

二进制手动部署kubernetes集群-k8s-1.17.9

通过以下命令,启动master-2节点的kube-proxy服务组件后
[root@k8s-master-2 ~]# cd /kubernetes/bin && nohup ./kube-proxy.sh &> /data/logs/kubernetes/kube-proxy/kube-proxy.out &
再次访问service的ip时,此时马上返回访问结果,实现service调度

二进制手动部署kubernetes集群-k8s-1.17.9

在启动余下节点的kube-proxy服务

[root@k8s-master-1 ~]# cd /kubernetes/bin && nohup ./kube-proxy.sh &> /data/logs/kubernetes/kube-proxy/kube-proxy.out &
[root@k8s-master-3 ~]# cd /kubernetes/bin && nohup ./kube-proxy.sh &> /data/logs/kubernetes/kube-proxy/kube-proxy.out &

10.部署CNI网络接口,这里以flannel插件为例,来实现pod间跨主机通信

1)github下载flannel网络插件二进制包

[root@k8s-master-1 ~]# wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz -O /tmp

二进制手动部署kubernetes集群-k8s-1.17.9

解压到指定目录下
[root@k8s-master-1 ~]# tar xvf /tmp/flannel-v0.11.0-linux-amd64.tar.gz -C /kubernetes/flannel/
查看解压后的二进制
[root@k8s-master-1 ~]# ll  /kubernetes/flannel/

二进制手动部署kubernetes集群-k8s-1.17.9

2)创建flannel的启动脚本、等必要配置文件

编辑flannel启动脚本
[root@k8s-master-1 ~]# vim /kubernetes/flannel/flanneld.sh

二进制手动部署kubernetes集群-k8s-1.17.9

添加执行权限
[root@k8s-master-1 ~]# chmod +x  /kubernetes/flannel/flanneld.sh
创建subnet.env子网环境变量配置
[root@k8s-master-1 ~]# vim /kubernetes/flannel/subnet.env

二进制手动部署kubernetes集群-k8s-1.17.9

复制必要的证书文件
[root@k8s-master-1 ~]# cp /certs/{ca.pem,client-key.pem,client.pem}    /kubernetes/flannel/cert/
手动通过etcd数据库配置flannel网络类型,类型为vxlan并开启直接路由功能
[root@k8s-master-1 ~]# /kubernetes/etcd/etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16","Backend": {"Type":"VxLAN","Directrouting": true }}'
查看设置的网络,类型为vxlan
[root@k8s-master-1 ~]# /kubernetes/etcd/etcdctl get /coreos.com/network/config

二进制手动部署kubernetes集群-k8s-1.17.9

3)复制flannel插件所有相关文件至master-2和master-3节点

[root@k8s-master-1 ~]# scp -r /kubernetes/flannel/ 192.168.30.91:/kubernetes/  #修改启动脚本节点ip为本机和subnet.env中的子网docker0
[root@k8s-master-1 ~]# scp -r /kubernetes/flannel/ 192.168.30.92:/kubernetes/ #修改启动脚本节点ip为本机和subnet.env中的子网docker0

4)执行以下命令,启动各节点的flannel网络插件程序,并验证pod跨节点通信

启动flannel网络插件服务
[root@k8s-master-1 ~]#  cd /kubernetes/flannel/ && nohup ./flanneld.sh &> /kubernetes/flannel/flanneld.out &
查看出两个pod应用分别运行在不同的节点
[root@k8s-master-1 ~]# kubectl get pod -o wide

二进制手动部署kubernetes集群-k8s-1.17.9

进入其中一个pod容器,可以ping通另外一节点的pod,从而实现pod跨节点通信
[root@k8s-master-1 ~]# kubectl exec -it nginx-deployment-5c75fcbd67-2s2hx bash

二进制手动部署kubernetes集群-k8s-1.17.9