k8s集群部署一:环境规划、docker安装、证书生成、etcd部署

环境规划


概述

虚拟机部署一个2节点1master的小型集群,并且在master和node上都安装etcd来实现etcd集群。

软件选型及版本

软件 版本
Linux 系统 CentOS Linux release 7.3.1611 (Core)
kubernetes 1.9
Docker 17.12-ce
etcd 3.0

服务器角色分配

角色 IP 组件 配置
master 10.10.99.225 kube-apiserver kube-controller-manager kube-scheduler etcd 4核4G
node01 10.10.99.233 kubelet kube-proxy docker flannel etcd 4核4G
node02 10.10.99.228 kubelet kube-proxy docker flannel etcd 4核4G

其他设置

所有服务器关闭selinux功能。

安装docker


以下操作在所有node节点上执行

依赖环境安装

yum install -y yum-utils device-mapper-persistent-data lvm2

添加docker-ce源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker-ce

// 查看docker-ce的版本
yum list docker-ce --showduplicates|sort -r

// 安装指定版本的docker-ce
yum install -y docker-ce-17.12.1.ce-1.el7.centos

设置daemon.json文件

mkdir /etc/docker
vim /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://registry.docker-cn.com"],
    "insecure-registries":["10.10.99.226:80"]
}

这里设置了国内的镜像源和我自己的harbor仓库,第二个私有仓库也可以不设置。

启动docker服务

systemctl start docker
systemctl status docker
systemctl enable docker

自签TLS证书


在master上创建证书,然后分发

组件及使用的证书

组件 使用的证书
etcd 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

下载cfssl证书生成工具

// 创建生成证书的目录
mkdir /root/ssl
cd /root/ssl

// 下载相关工具
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

// 移动到/usr/local/bin
 mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

cfssl用于生成证书,cfssljson用于将json导入证书,cfssl-certinfo用于查看证书内容

CA配置

新建CA配置文件

cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

新建CA证书签发请求文件

cat > ca-csr.json <<EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Guangzhou",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

生成CA证书和私钥

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

这一步后将生成ca-key.pem ca.pem这两个文件

生成server证书和私钥

cat > server-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "10.10.99.225",
      "10.10.99.233",
      "10.10.99.228",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Guangzhou",
            "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

这一步后生成了server-key.pemserver.pem

生成admin证书和私钥

cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Shenzhen",
      "ST": "Guangzhou",
      "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

这一步后生成了admin-key.pemadmin.pem两个文件

生成kube-proxy证书和私钥

cat > kube-proxy-csr.json <<EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Shenzhen",
      "ST": "Guangzhou",
      "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

这一步后生成了kube-proxy-key.pem kube-proxy.pem两个文件

保留pem证书,将其他文件删除或移动

mkdir /root/ssl/config
cd /root/ssl
ls | grep -v pem | xargs  -i mv  {} config

部署etcd集群


需要在master和node上都部署,首先在master上部署,然后把相关的二进制文件和程序拷贝到node上即可

下载etcd软件包

wget https://github.com/coreos/etcd/releases/tag/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz

创建集群组件安装目录

mkdir /opt/kubernetes
mkdir /opt/kubernetes/{bin,cfg,ssl}

集群所有组件都在这个目录下,为了管理方便。
bin目录存放二进制文件,cfg存放配置文件,ssl存放证书

将二进制文件移动到指定目录

mv /root/etcd-v3.2.12-linux-amd64/etcd /opt/kubernetes/bin/
mv /root/etcd-v3.2.12-linux-amd64/etcdctl /opt/kubernetes/bin/

创建etcd配置文件

cat > /opt/kubernetes/cfg/etcd <<EOF
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://10.10.99.225:2380"
ETCD_LISTEN_CLIENT_URLS="https://10.10.99.225:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.99.225:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.10.99.225:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://10.10.99.225:2380,etcd02=https://10.10.99.233:2380,etcd03=https://10.10.99.228:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

ETCD_NAME:指定etcd集群名称
ETCD_DATA_DIR:etcd数据目录
ETCD_LISTEN_PEER_URLS:监听的客户端地址
ETCD_LISTEN_CLIENT_URLS:监听的数据端口
ETCD_INITIAL_CLUSTER:集群节点信息
ETCD_INITIAL_CLUSTER_TOKEN:认证的token,可自定义
ETCD_INITIAL_CLUSTER_STATE:集群建立的状态

注意:上边的这个配置文件是master的配置文件内容,配置node节点的配置文件需要修改ETCD_NAME、ETCD_LISTEN_PEER_URLS、ETCD_LISTEN_CLIENT_URLS、ETCD_INITIAL_ADVERTISE_PEER_URLS、ETCD_ADVERTISE_CLIENT_URLS,修改为对应节点的ip地址,还有节点名称要和ETCD_INITIAL_CLUSTER中的对应。

创建etcd启动配置文件

cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd
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
EOF

导入证书

cp /root/ssl/server*pem /root/ssl/ca*pem /opt/kubernetes/ssl/

启动etcd服务

systemctl daemon-reload
systemctl start etcd.service
systemctl enable etcd.service

这里写图片描述

在第一次启动的时候可能会很卡,直接Ctrl+C退出即可。可能的原因是在启动的时候会尝试连接指定的其他etcd节点(其他节点此时还未部署,连接失败)。

master和node互信(不必要)

这一步不是必须的,但是可以方便管理。比如下边的操作,将master上配置的etcd相关程序和文件拷贝到node上就不需要密码了。

在master上生成ssl证书:

// 一直回车
ssh-keygen
ssh-copy-id 10.10.99.228
ssh-copy-id 10.10.99.233

从master上将etcd必要文件拷贝到node上并启动

// 拷贝etcd二进制文件
scp /opt/kubernetes/bin/* 10.10.99.233:/opt/kubernetes/bin
scp /opt/kubernetes/bin/* 10.10.99.228:/opt/kubernetes/bin

// 拷贝etcd配置文件
scp /opt/kubernetes/cfg/etcd 10.10.99.228:/opt/kubernetes/cfg
scp /opt/kubernetes/cfg/etcd 10.10.99.233:/opt/kubernetes/cfg

// 拷贝证书
scp /opt/kubernetes/ssl/* 10.10.99.233:/opt/kubernetes/ssl
scp /opt/kubernetes/ssl/* 10.10.99.228:/opt/kubernetes/ssl

// 启动文件拷贝
scp /usr/lib/systemd/system/etcd.service 10.10.99.228:/usr/lib/systemd/system
scp /usr/lib/systemd/system/etcd.service 10.10.99.233:/usr/lib/systemd/system

// 各个node启动etcd
systemctl daemon-reload
systemctl start etcd.service
systemctl enable etcd.service

注意:各node节点需要更改etcd配置文件中的ip。

测试etcd集群状态

// 将kubernetes命令路径加入系统变量
echo "PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
source /etc/profile

// 测试集群健康状态
etcdctl -ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://10.10.99.225:2379,https://10.10.99.228:2379,https://10.10.99.233:2379" cluster-health

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_35930259/article/details/79944203