zoukankan      html  css  js  c++  java
  • (转)基于TLS证书手动部署kubernetes集群(上)

    转:https://www.cnblogs.com/wdliu/archive/2018/06/06/9147346.html

    一、简介

    Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。 K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。 K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。 2015年7月,Kubernetes v1.0正式发布,截止到2018年6月,最新稳定版本是v1.10。 Kubernetes目标是让部署容器化应用简单高效。

    官方网站:https://kubernetes.io/

    二、环境规划

    1.软件环境

    软件  版本 
    操作系统 CentOS Linux release 7.4.1708 (Core)

    Kubernetes 

    1.9

    Docker 

    17.12-ce 

    Etcd 

    3.2
    Flanneld
     
    0.9.1

     

    2.节点规划

    角色

    IP 组件
    master 10.1.210.33

    kube-apiserver
    kube-controller-manager
    kube-scheduler
    etcd

    node1 10.1.210.32

    kubelet
    kube-proxy
    docker
    flannel
    etcd

    node2 10.1.210.34  

    kubelet
    kube-proxy
    docker
    flannel
    etcd

    三、docker部署

    1.关闭seliux和firewalld

    复制代码
    #关闭selinux
    vi /etc/selinux/config
    将SELINUX=enforcing修改为SELINUX=disabled 
    重启系统 reboot
    
    #关闭firewalld
    systemctl stop firewalld
    复制代码

    2.如果主机上部署了比较老版本的docker(老版本也可以),先进行卸载,可跳过此步骤

    复制代码
    #查看是否已经安装的Docker软件包
    yum list installed | grep docker
    
    #移除已经安装的docker包
    yum remove docker-ce
    
    #删除残留的镜像文件信息
    rm -rf /var/lib/docker
    
    #找到原有docker残留文件,并删除
    find / -name "docker*"
    rm  -rf  残留文件
    复制代码

    3.安装docker-ce

    方式一:

    官方安装方法:

    复制代码
    # 安装yum工具包
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    #添加docker-ce stable版本的仓库
    sudo yum-config-manager 
      --add-repo 
      https://download.docker.com/linux/centos/docker-ce.repo
    
    #安装docker
    yum install docker-ce
    
    
    #设置开机自启动
    systemctl enable docker.service
    
    #启动
    systemctl start docker
    
    #查看是否安装成功
    docker info
    复制代码

    方式二:

    使用阿里云镜像,速度更快,安装步骤:

    复制代码
    #  安装yum工具包
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 添加仓库
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    #  更新yum源缓存
    yum makecache fast
    
    # 查找Docker-CE的版本:
    yum list docker-ce.x86_64 --showduplicates | sort -r
    
    #安装指定版本docker
    #yum -y install docker-ce-[VERSION]
    yum install docker-ce-17.12.0.ce-1.el7.centos
    复制代码

    4.可能出现的错误:

    启动报错:docker Failed to start docker.service: Unit not found,这个问题苦恼了半天,重装了几遍还是一样,网上很多方法都没有解决,后来把以前装的docker文件删除干净,再重装,启动成功了。

    原因:由于旧版docker的配置文件或者安装文件没有完全删除,这个问题苦恼了半天。

    解决版本:卸载现有版本的docker,使用find / -name "docker*" 找到安装的文件,全部删除,再安装新的docker

    四、生成自签TLS证书

    1.安装证书生成工具cfssl

    这里我选择在master上进行证书的生成

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

    2.生成模版json

    复制代码
    # 建立存放生成的证书文件,方便管理 
    mkdir -p /opt/kubernetes/ssl
    cd /opt/kubernetes/ssl
    # 生成证书模版
    cfssl print-defaults config > config.json
    
    
    ###生成的模版示列####
    #cat config.json

    { "signing": { "default": { "expiry": "168h" }, "profiles": { "www": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "client auth" ] } } } }
    复制代码

    3.修改TLS模版证书为我们自己使用:

    复制代码
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    复制代码

    4.生成ca模版以及修改模版

    复制代码
    #生成csr模版
    cfssl print-defaults csr > csr.json
    #结果
    {
        "CN": "example.net",
        "hosts": [
            "example.net",
            "www.example.net"
        ],
        "key": {
            "algo": "ecdsa",
            "size": 256
        },
        "names": [
            {
                "C": "US",
                "L": "CA",
                "ST": "San Francisco"
            }
        ]
    }
    
    # 修改csr文件为我们使用
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing",
                  "O": "k8s",
                "OU": "System"
            }
        ]
    }
    复制代码

    5.生成证书、和key

    cfssl gencert -initca csr.json | cfssljson -bare ca -

    6.由于需要生成的证书太多,并且容易出错,一旦出错整个下面的步骤都将进行不下去,所以编写了脚本进行生成,注意,其中需要修改为自己集群IP地址,下面是是脚本:

    cat > ca-config.json <<EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
             "expiry": "87600h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }
    EOF
    
    cat > ca-csr.json <<EOF
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Beijing",
                "ST": "Beijing",
                  "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
    
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    #-----------------------
    
    cat > server-csr.json <<EOF
    {
        "CN": "kubernetes",
        "hosts": [
          "127.0.0.1",
          "10.1.210.32",
          "10.1.210.33",
          "10.1.210.34",
          "10.10.10.1",
          "kubernetes",
          "kubernetes.default",
          "kubernetes.default.svc",
          "kubernetes.default.svc.cluster",
          "kubernetes.default.svc.cluster.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "BeiJing",
                "ST": "BeiJing",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    
    #-----------------------
    
    cat > admin-csr.json <<EOF
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    
    #-----------------------
    
    cat > kube-proxy-csr.json <<EOF
    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    cerificate.sh

    7.执行脚本完成后,会生成如下证书文件:

    8.证书使用组件说明:

    组件   使用的证书
    etcd ca.pem server.pem server-key.pem
    flannel ca.pem server.pem server-key.pem
    kube-apiserver ca.pem server.pem server-key.pem
    kubelet ca.pem ca-key.pem
    kube-proxy ca.pem kube-proxy.pem kube-proxy-key.pem
    kubectl ca.pem admin.pem admin-key.pem
    五、部署etcd集群

    1.软件包下载

    下载地址:https://github.com/coreos/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz

    2.解压,配置。注意,这里为了规范,将所有软件部署在/opt/kubernetes目录下

    复制代码
    #创建部署目录
    mkdir /opt/kubernetes -p
     
    #创建其他目录,包括配置文件、可执行脚本、
    mkdir /opt/kubernetes/{bin,conf,ssl}
    
    #解压
    tar zxvf etcd-v3.2.12-linux-amd64.tar.gz
    
    #拷贝可执行文件
    cp etcd-v3.2.12-linux-amd64/etcd /opt/kubernetes/bin/
    cp etcd-v3.2.12-linux-amd64/etcdctl /opt/kubernetes/bin/
    复制代码

    3.创建配置文件与服务unit,使用配置文件时候请删除注释。

    复制代码
     vi /opt/kubernetes/conf/etcd.conf
    
    #[Member]
    ETCD_NAME="etcd02"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://10.1.210.33:2380"   #集群通信端口
    ETCD_LISTEN_CLIENT_URLS="https://10.1.210.33:2379" #监听的数据端口
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.1.210.33:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://10.1.210.33:2379"
    ETCD_INITIAL_CLUSTER="etcd01=https://10.1.210.32:2380,etcd02=https://10.1.210.33:2380,etcd03=https://10.1.210.34:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"  #认证token
    ETCD_INITIAL_CLUSTER_STATE="new"          #集群建立状态
    
    
    vi /usr/lib/systemd/system/etcd.service
    ###### 服务配置启动配置
    
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    EnvironmentFile=-/opt/kubernetes/conf/etcd.conf
    ExecStart=/opt/kubernetes/bin/etcd 
    --name=${ETCD_NAME} 
    --data-dir=${ETCD_DATA_DIR} 
    --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} 
    --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 
    --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} 
    --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} 
    --initial-cluster=${ETCD_INITIAL_CLUSTER} 
    --initial-cluster-token=${ETCD_INITIAL_CLUSTER} 
    --initial-cluster-state=new 
    --cert-file=/opt/kubernetes/ssl/server.pem 
    --key-file=/opt/kubernetes/ssl/server-key.pem 
    --peer-cert-file=/opt/kubernetes/ssl/server.pem 
    --peer-key-file=/opt/kubernetes/ssl/server-key.pem 
    --trusted-ca-file=/opt/kubernetes/ssl/ca.pem 
    --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    复制代码

    4.重载system服务,启动etcd

    systemctl daemon-reload
    systemctl start etcd

    5.其他两个节点做相同的操作,注意配置文件稍微有些变化,这里就不重复说明,由于使用了证书,所有查看集群操作都需要使用证书,如下:

    /opt/kubernetes/bin/etcdctl 
    > --ca-file=/opt/kubernetes/ssl/ca.pem 
    > --cert-file=/opt/kubernetes/ssl/server.pem 
    > --key-file=/opt/kubernetes/ssl/server-key.pem cluster-health

    如图下所示,我们的etcd集群部署完成

    六、部署flannel网络服务

    1.分配集群网络存储到etcd中,以供flannel使用

    /opt/kubernetes/bin/etcdctl 
    > --ca-file=/opt/kubernetes/ssl/ca.pem 
    > --cert-file=/opt/kubernetes/ssl/server.pem 
    > --key-file=/opt/kubernetes/ssl/server-key.pem set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

    2.下载安装包

    下载地址:https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz 

    3.部署、配置flannel,这里需要注意,flannel网络是在node节点上进行的,所有我们在10.1.210.32、10.1.210.34上进行部署,以10.1.210.32为列

    复制代码
    #解压
    tar zxvf flannel-v0.9.1-linux-amd64.tar.gz 
    
    #拷贝启动脚本
    cp flanneld /opt/kubernetes/bin/
    cp mk-docker-opts.sh /opt/kubernetes/bin/
    
    #配置文件配置:
    vi /opt/kubernetes/conf/flanneld.conf
    
    ETCD_ENDPOINTS="--etcd-endpoints=https://10.1.210.32:2379,https://10.1.210.33:2379,https://10.1.210.34:2379"
    FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} 
    -etcd-cafile=/opt/kubernetes/ssl/ca.pem 
    -etcd-certfile=/opt/kubernetes/ssl/server.pem 
    -etcd-keyfile=/opt/kubernetes/ssl/server-key.pem"
    
    #启动服务器配置
    vi /usr/lib/systemd/system/flanneld.service
    
    [Unit]
    Description=Flanneld overlay address etcd agent
    After=network-online.target network.target
    Before=docker.service
    
    [Service]
    Type=notify
    EnvironmentFile=/opt/kubernetes/conf/flanneld.conf
    ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
    ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    复制代码

    4.启动

    systemctl daemon-reload
    systemctl start flanneld

    5.启动成功后会生成flannel的网卡如下图:

    6.修改docker配置文件指定flannel网络

    vi /usr/lib/systemd/system/docker.service
    
    #修改为
    EnvironmentFile=/run/flannel/subnet.env
    ExecStart=/usr/bin/dockerd  $DOCKER_NETWORK_OPTIONS

    7.重启docker,检查docker0网卡是否和flannel网卡网段一致

    systemctl daemon-reload
    systemctl restart docker

    8.在集群的另一个节点也按照同样的方法安装,检查两个节点flannel网络是否通信的办法互ping flannel网关(网卡IP)

  • 相关阅读:
    [NOTE]常用Linux命令总结[Thx for commandlinefu]
    [原]隧道Proxy原理详解(基于Node.js)
    [转]MySQL索引详解(1)
    [QA]服务端进程模型
    [转]MySQL索引详解(2)
    非动态规划实现LCS算法
    Java里线程安全的有界容器的实现
    maven历史版本下载
    JDK9下载
    maven排除依赖和添加本地依赖
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/9723929.html
Copyright © 2011-2022 走看看