美文网首页
一步一步搭建kubernetes

一步一步搭建kubernetes

作者: 一切重新来 | 来源:发表于2018-11-17 02:17 被阅读0次

    背景

    在裸辞后折腾了两个月终于找到了一个像样的工作,在进入公司后安排我去做和kubernetes相关的工作。之前docker接触的都很少,所以从使用二进制文件搭建kubernetes环境进行入门学习。

    需要的环境

    • 三台虚拟机(已配置静态ip),可访问外网。
    • centos7

    开始搭建之旅

    准备搭建kubernetes环境中的所有二进制文件

    我已经将本次需要的二进制文件都已经打包下载了本地,需要copy的我的三太虚拟机中。在这个之前我先使用如下命令:

    hostnamectl set-hostname master
    

    将三台虚拟机hostname分别设置为masternode1node2。在后期我们将通过master对node1,node2节点进行操作完成镜像的部署。
    使用fstp命令将准备好的压缩包copy到虚拟机:

    sftp local-master-root123456
    

    sftp后面是跟的我虚拟机的地址,但是我在.ssh下的config文件中做了如下的配置可以使用table键快速的补全

    Host local-master-root123456
      HostName 192.168.0.110
      User root
      Port 22
    
    Host local-node1-root123456
      HostName 192.168.0.111
      User root
      Port 22
    
    Host local-node2-root123456
      HostName 192.168.0.112
      User root
      Port 22
    

    将准备好的压缩文件bin-k8s-164.tar.gz使用sftp上传到三台虚拟中并解压,解压出来的bin文件下就是这次环境搭建所需要的所有工具。解压后将bin文件放在/opt/k8s路径下。

    准备环境变量
    vi /etc/profile
    

    添加如下环境变量

    ##k8s SETTING
    
    # 生成 EncryptionConfig 所需的加密 key
    export BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
    
    # 最好使用 当前未用的网段 来定义服务网段和 Pod 网段
    
    # 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 和 ipvs 保证)
    export SERVICE_CIDR="10.254.0.0/16"
    
    # Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
    export CLUSTER_CIDR="172.30.0.0/16"
    
    # 服务端口范围 (NodePort Range)
    export NODE_PORT_RANGE="8400-9000"
    
    # 集群各机器 IP 数组
    export NODE_IPS="172.168.0.110 172.168.0.111 172.168.0.112"
    
    export NODE_NAME=master
    
    export NODE_IP=172.168.0.110
            
    # 集群各 IP 对应的 主机名数组
    export NODE_NAMES="master node1 node2"
    
    # kube-apiserver 的 VIP(HA 组件 keepalived 发布的
    export MASTER_VIP=172.168.0.110
    
    # kube-apiserver VIP 地址(HA 组件 haproxy 监听 8443 端口)
    export KUBE_APISERVER="https://${MASTER_VIP}:8443"
    
    # HA 节点,配置 VIP 的网络接口名称
    export VIP_IF="eth0"
    
    # etcd 集群服务地址列表
    export ETCD_ENDPOINTS="https://172.168.0.110:2379,https://172.168.0.111:2379,https://172.168.0.112:2379"
    
    # etcd 集群间通信的 IP 和端口
    export ETCD_NODES="master=https://172.168.0.110:2380,node1=https://172.168.0.111:2380,node2=https://172.168.0.112:2380"
    
    # flanneld 网络配置前缀
    export FLANNEL_ETCD_PREFIX="/kubernetes/network"
    
    # kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
    export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
    
    # 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
    export CLUSTER_DNS_SVC_IP="10.254.0.2"
    
    # 集群 DNS 域名
    export CLUSTER_DNS_DOMAIN="cluster.local."
    
    # 将二进制目录 /opt/k8s/bin 加到 PATH 中
    export PATH=/opt/k8s/bin:$PATH
    

    再添加了环境变量后也不要忘记

    source /etc/profile
    

    使环境变量生效,其中NODE_NAME,NODE_IP要根据不同的节点配置相应的内容

    开始安装kubernetes所需插件
    1. 创建CA证书和密钥

    kubernetes 系统各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。
    cfssl工具已经在/opt/k8s/bin目录下我们无需再进行安装。

    在master上分别生成CA证书和密钥

    [root@master ~]# mkdir ssl
    [root@master ~]# cd ssl
    [root@master ~]# cfssl print-defaults config > config.json
    [root@master ~]# cfssl print-defaults csr > csr.json
    

    生成如下文件

    [root@master ~]# cd ssl/
    [root@master ssl]# ls
    config.json  csr.json
    

    创建CA配置文件

    [root@master ssl]# vi ca-config.json
    {
      "signing": {
        "default": {
          "expiry": "8760h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "8760h"
          }
        }
      }
    }
    

    signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证;
    client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证

    创建 CA 证书签名请求:

    [root@master ssl]# vi ca-csr.json
    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    

    CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
    O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
    生成 CA 证书和私钥:

    [root@master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    2018/11/16 03:59:26 [INFO] generating a new CA key and certificate from CSR
    2018/11/16 03:59:26 [INFO] generate received request
    2018/11/16 03:59:26 [INFO] received CSR
    2018/11/16 03:59:26 [INFO] generating key: rsa-2048
    2018/11/16 03:59:26 [INFO] encoded CSR
    2018/11/16 03:59:26 [INFO] signed certificate with serial number 42633968990372506030174847640209844733625069020
    [root@master ssl]# ll
    总用量 28
    -rw-r--r--. 1 root root  290 11月 16 03:48 ca-config.json
    -rw-r--r--. 1 root root 1001 11月 16 03:59 ca.csr
    -rw-r--r--. 1 root root  208 11月 16 03:50 ca-csr.json
    -rw-------. 1 root root 1679 11月 16 03:59 ca-key.pem
    -rw-r--r--. 1 root root 1359 11月 16 03:59 ca.pem
    -rw-r--r--. 1 root root  567 11月 16 03:31 config.json
    -rw-r--r--. 1 root root  287 11月 16 03:31 csr.json
    

    将生成的 CA 证书、秘钥文件、配置文件拷贝到所有机器的 /etc/kubernetes/ssl 目录下

    [root@master ssl]# sudo mkdir -p /etc/kubernetes/ssl
    [root@master ssl]# cp ca* /etc/kubernetes/ssl
    

    颁发证书你需要将证书和密钥文件copy到node1和node2节点上机器上。

    [root@master ~]# sftp root@192.168.0.111
    The authenticity of host '192.168.0.111 (192.168.0.111)' can't be established.
    ECDSA key fingerprint is SHA256:A8ry0oU6CfNAmQm0AC5BkiHy/47N9moAAmoFRF4cPKg.
    ECDSA key fingerprint is MD5:c3:b3:cf:d0:3c:22:ea:d7:8b:a6:60:71:fe:1e:3d:73.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.0.111' (ECDSA) to the list of known hosts.
    root@192.168.0.111's password:
    Connected to 192.168.0.111.
    sftp> lls
    anaconda-ks.cfg  bin  bin-k8s-164.tar.gz  ssl
    sftp> put -r ssl
    Uploading ssl/ to /root/ssl
    Entering ssl/
    ssl/config.json                                                                                 100%  567   335.2KB/s   00:00
    ssl/csr.json                                                                                    100%  287   192.1KB/s   00:00
    ssl/ca-config.json                                                                              100%  290   171.1KB/s   00:00
    ssl/ca-csr.json                                                                                 100%  208   117.4KB/s   00:00
    ssl/ca.pem                                                                                      100% 1359   740.5KB/s   00:00
    ssl/ca-key.pem                                                                                  100% 1679   853.2KB/s   00:00
    ssl/ca.csr                                                                                      100% 1001   582.6KB/s   00:00
    sftp>
    
    1. 部署高可用的etcd集群
      kuberntes 系统使用 etcd 存储所有数据,本文档介绍部署一个三节点高可用 etcd 集群,etcd的二进制文件已经在/opt/k8s/bin下
      创建TLS 秘钥和证书:
      先创建一个临时目录来存放生成的证书
    [root@master ~]# mkdir temp
    [root@master ~]# ls
    anaconda-ks.cfg  bin  bin-k8s-164.tar.gz  ssl  temp
    

    创建 etcd 证书签名请求:

    $ cat > etcd-csr.json <<EOF
    {
      "CN": "etcd",
      "hosts": [
        "127.0.0.1",
        "${NODE_IP}"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    

    hosts: 指定授权使用该证书的 etcd 节点 IP;
    生成 etcd 证书和私钥:

    [root@master temp]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
    >   -ca-key=/etc/kubernetes/ssl/ca-key.pem \
    >   -config=/etc/kubernetes/ssl/ca-config.json \
    >   -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
    2018/11/16 05:18:11 [INFO] generate received request
    2018/11/16 05:18:11 [INFO] received CSR
    2018/11/16 05:18:11 [INFO] generating key: rsa-2048
    2018/11/16 05:18:11 [INFO] encoded CSR
    2018/11/16 05:18:11 [INFO] signed certificate with serial number 19240619242020143105085287569354169702928195310
    2018/11/16 05:18:11 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    websites. For more information see the Baseline Requirements for the Issuance and Management
    of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    specifically, section 10.2.3 ("Information Requirements").
    [root@master temp]# ls
    etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem
    

    将证书和私钥放在/etc/etcd/ssl目录下

    [root@master temp]# mkdir -p /etc/etcd/ssl
    [root@master temp]# mv etcd*.pem /etc/etcd/ssl
    [root@master temp]# ls /etc/etcd/ssl/
    etcd-key.pem  etcd.pem
    [root@master temp]# ls
    etcd.csr  etcd-csr.json
    [root@master temp]# rm -f etcd*
    

    创建 etcd 的 systemd unit 文件, 我们将使用systemctl来启动etcd这个服务:
    创建etcd的工作目录:

    [root@master temp]# mkdir -p /var/lib/etcd
    
    cat > etcd.service <<EOF
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    Documentation=https://github.com/coreos
    
    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    ExecStart=/opt/k8s/bin/etcd \\
      --name=${NODE_NAME} \\
      --cert-file=/etc/etcd/ssl/etcd.pem \\
      --key-file=/etc/etcd/ssl/etcd-key.pem \\
      --peer-cert-file=/etc/etcd/ssl/etcd.pem \\
      --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
      --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
      --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
      --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
      --listen-peer-urls=https://${NODE_IP}:2380 \\
      --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
      --advertise-client-urls=https://${NODE_IP}:2379 \\
      --initial-cluster-token=etcd-cluster-0 \\
      --initial-cluster=${ETCD_NODES} \\
      --initial-cluster-state=new \\
      --data-dir=/var/lib/etcd
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    • 为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);

    启动服务etcd服务

    [root@master temp]# mv etcd.service /etc/systemd/system/
    [root@master temp]# systemctl daemon-reload
    [root@master temp]# systemctl enable etcd
    Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /etc/systemd/system/etcd.service.
    

    完成node节点配置后再启动服务:

    systemctl start etcd
    

    相关文章

      网友评论

          本文标题:一步一步搭建kubernetes

          本文链接:https://www.haomeiwen.com/subject/eksvfqtx.html