环境规划
概述
虚拟机部署一个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.pem 和server.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.pem和admin.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