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)

  • 相关阅读:
    UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)
    UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)
    【Same Tree】cpp
    【Recover Binary Search Tree】cpp
    【Binary Tree Zigzag Level Order Traversal】cpp
    【Binary Tree Level Order Traversal II 】cpp
    【Binary Tree Level Order Traversal】cpp
    【Binary Tree Post order Traversal】cpp
    【Binary Tree Inorder Traversal】cpp
    【Binary Tree Preorder Traversal】cpp
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/9723929.html
Copyright © 2011-2022 走看看