kubernetes1.13.0二进制部署ETCD集群(一)

kubernetes1.13.0二进制部署ETCD集群(一)

前言

之前为了能够快速学习kubernetes,通过kubeadm搭建的集群,确实也和介绍一样,搭建很简单便捷。各部分组件都是以pod形式运行。但是屏蔽了一些操作细节和原理。于是我打算写一篇企业级二进制部署kubernetes集群。记录一下完整的学搭建过程。希望能加深下自己的印象,同时也给一起学习这部分知识的小伙伴点细微帮助。第一篇我们来部署ETCD集群

kubenetes集群架构与组件

环境准备

vip              192.168.137.200   用于双master高可用vip切换

master-1    192.168.137.104  (kube-apiserver,kube-controller-manager,kube-schedular,etcd)

master-2    192.168.137.107   (kube-apiserver,kube-controller-manager,kube-schedular。)

client-1       192.168.137.105    (kubelet,kupe-proxy,docker,flannel,etcd)

client-2       193.168.137.106     (kubelet,kupe-proxy,docker,flannel,etcd)

系统环境初始化

备注:

为了方便搭建我这里给master-1安装了ansible。host文件为

[all]
192.168.137.[104:107]
[all:vars]
ansible_ssh_port=9777
[client]
192.168.137.[105:106]
[master-2]
192.168.137.107

1.各个主机做hosts解析

[root@master-1 ~]# cat /etc/hosts
192.168.137.104 master-1
192.168.137.107 master-2
192.168.137.105 client-1
192.168.137.106 client-2
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

2.各个主机做ntp时间同步

[root@master-1 ~]# ansible all -m shell -a “ntpdate ntp1.aliyun.com”

3.关闭selinux

永久关闭:ansible all -m shell -a “sed -i “s/^SELINUX=enforcing/SELINUX=disabled/g” /etc/sysconfig/selinux”

临时关闭:ansible all -m shell -a “setenforce 0”

验证:        ansible all -m shell -a “getenforce”

4.关闭swap

ansible all -m shell -a “swapoff -a”

ansible all -m shell -a “sed -i ‘s/.*swap.*/#&/’ /etc/fstab

5.设置内核参数

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward = 1

vm.swappiness = 0

6.准备部署目录

ansible all -m shell -a “mkdir -p /opt/kubernetes/{bin,cfg,ssl,log}”

7.CA签名证书的创建和分发

从k8s的1.8版本开始,K8S系统各组件需要使用TLS证书对通信进行加密。每一个K8S集群都需要独立的CA证书体系。CA证书有以下三种:easyrsa、openssl、cfssl。这里使用cfssl证书,也是目前使用最多的,相对来说配置简单一些,通过json的格式,把证书相关的东西配置进去即可。这里使用cfssl的版本为1.2版本。

1.安装cfssl

下载速度比较慢,我这里提前下载本地,然后分发各个主机

  • 下载

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


  • 改名并移动

mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

mv cfssl_linux-amd64 /usr/local/bin/cfssl

chmod a+x ./* 

  • ansible分发

打包所有文件:zip -r cfssl.zip ./*

分发压缩包: ansible all -m copy -a “src=/usr/local/bin/cfssl.zip dest=/usr/local/bin/”

解压压缩包:

ansible all -m unarchive -a “creates=cfssl.zip src=/usr/local/bin/cfssl.zip dest=/usr/local/bin/ mode=777”

注意:不可以用ansible all -m shell -a “unzip /usr/local/bin/cfssl.zip” 直接无响应卡死。

  • 初始化cfssl

mkdir ssl && cd ssl

cfssl print-defaults config > config.json   (此时会创建默认配置config.json)

  • 创建用来生成CA文件的json配置文件

cat >>ca-config.json<<EOF

{
“signing”:{
“default”:{
“expiry”:”87600h”
},
“profiles”:{
“kubernetes”:{
“expiry”:”87600h”,
“usages”:[
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}

EOF

signing        :表示该证书可以签名其他证书,生成的ca.pem中CA=TRUE;

server auth :表示client可以用该CA对server提供的证书进行认证;

client auth  :     表示server可以用该CA对client提供的证书进行验证

也就是server与client可以用该配置的CA做双向认证。

  • 创建用来生成CA证书签名请求的json配置文件

cat >>ca-csr.json<<EOF

{
“CN”: “kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}

EOF

  • 生成CA签名证书

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

ca-csr.json 就是刚才CA签名证书的配置文件,通过cfssl和cfssljson用它来生成证书 结尾 ca 指定生成证书的名字

生成后多了三个个文件:

ca-key.pem   

ca.pem

ca.csr

  • 分发CA证书和密钥到其他节点

ansible all -m copy -a “src=/root/ssl/ca.csr dest=/opt/kubernetes/ssl/”

ansible all -m copy -a “src=/root/ssl/ca.pem dest=/opt/kubernetes/ssl/”

ansible all -m copy -a “src=/root/ssl/ca-key.pem dest=/opt/kubernetes/ssl/”

ansible all -m copy -a “src=/root/ssl/ca-config.json dest=/opt/kubernetes/ssl/”

  • 查看证书是否分发到各个节点

ansible all -m shell -a “ls /opt/kubernetes/ssl/”

ETCD部署

各个资源对象状态信息(比如flannel)都是以KV的形式持久化存储在ETCD中。类似zookeeper,提供分布式协调服务。之所以说kubenetes各个组件是无状态的,就是因为其中把数据都存放在ETCD中。由于ETCD支持集群,这里在三台主机上都部署上ETCD。

但是要注意ETCD 2版本和3版本有很大区别(包括配置和功能,2几乎弃用了,生产都是3版本)。这里的版本要以api_version来看。而不是version 。这里是个坑点。

  • 生成ETCD证书

cat >>etcd-csr.json<<EOF

{
“CN”: “etcd”,
“hosts”: [
“127.0.0.1”,
“192.168.137.104”,
“192.168.137.105”,
“192.168.137.106”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}

EOF

  • 生成证书和私钥

进入证书所在目录执行

cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
etcd-csr.json | cfssljson -bare etcd

  • 复制证书到其他ETCD节点

本机master-1 执行

cp etcd*.pem /opt/kubernetes/ssl/

ansible client -m copy -a “src=/root/ssl/etcd.pem dest=/opt/kubernetes/ssl/”

ansible client -m copy -a “src=/root/ssl/etcd-key.pem dest=/opt/kubernetes/ssl/”

  • 下载安装ETCD

cd /usr/local/src/

wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz

tar -xvzf etcd-v3.3.10-linux-amd64.tar.gz -C /usr/local

cd /usr/local && mv etcd-v3.3.10-linux-amd64/ ./etcd

cp etcd etcdctl /opt/kubernetes/bin/

ansible client -m copy -a “src=/usr/local/etcd/etcd dest=/opt/kubernetes/bin/ mode=777”

ansible client -m copy -a “src=/usr/local/etcd/etcdctl dest=/opt/kubernetes/bin/ mode=777”

注意:ansible copy模块 拷贝过去的文件权限并不是源文件权限,而是系统生成文件权限。我这里设置777,之前没有设置mode权限,导致etcd etcdctl 不可执行。

  • 设置etcd配置文件

#[member]
ETCD_NAME=”etcd-node1
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
ETCD_LISTEN_PEER_URLS=”https://192.168.137.104:2380″
ETCD_LISTEN_CLIENT_URLS=”https://192.168.137.104:2379,https://127.0.0.1:2379″
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS=”https://192.168.137.104:2380″
ETCD_INITIAL_CLUSTER=”etcd-node1=https://192.168.137.104:2380,etcd-node2=https://192.168.137.105:2380,etcd-node3=https://192.168.137.106:2380″
ETCD_INITIAL_CLUSTER_STATE=”new”
ETCD_INITIAL_CLUSTER_TOKEN=”k8s-etcd-cluster”
ETCD_ADVERTISE_CLIENT_URLS=”https://192.168.137.104:2379″
#[security]
CLIENT_CERT_AUTH=”true”
ETCD_CA_FILE=”/opt/kubernetes/ssl/ca.pem”
ETCD_CERT_FILE=”/opt/kubernetes/ssl/etcd.pem”
ETCD_KEY_FILE=”/opt/kubernetes/ssl/etcd-key.pem”
PEER_CLIENT_CERT_AUTH=”true”
ETCD_PEER_CA_FILE=”/opt/kubernetes/ssl/ca.pem”
ETCD_PEER_CERT_FILE=”/opt/kubernetes/ssl/etcd.pem”
ETCD_PEER_KEY_FILE=”/opt/kubernetes/ssl/etcd-key.pem”

分发到其他etcd节点,但是需要保证红色部分参数对应着自己etcd节点的ip地址,每个节点etcd_name需要修改


参数介绍:

ETCD_NAME 节点名称
ETCD_DATA_DIR 数据目录
ETCD_LISTEN_PEER_URLS 集群通信监听地址
ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址
ETCD_INITIAL_ADVERTISE_PEER_URLS 集群通告地址
ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址
ETCD_INITIAL_CLUSTER 集群节点地址
ETCD_INITIAL_CLUSTER_TOKEN 集群Token
ETCD_INITIAL_CLUSTER_STATE 加入集群的当前状态,new是新集群,existing表示加入已有集群


  • 创建etcd系统服务

[Unit]
Description=Etcd Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c “GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd”
Type=notify

[Install]
WantedBy=multi-user.target

注意:保证路径都对应上即可。这里etcd 数据目录为/var/lib/etcd/

分发服务文件到各个节点。(配置不用改)


  • 所有节点创建ETCD数据目录

mkdir /var/lib/etcd/ -pv 

  • 启动etcd服务

各节点执行

service etcd start 

chkconfig etcd on 

  • 集群验证

etcdctl –endpoints=https://192.168.137.104:2379,https://192.168.137.105:2379,https://192.168.137.106:2379 \
–ca-file=/opt/kubernetes/ssl/ca.pem \
–cert-file=/opt/kubernetes/ssl/etcd.pem \
–key-file=/opt/kubernetes/ssl/etcd-key.pem cluster-health

总结

到此ETCD三节点集群部署完成,下节在此基础上部署flannel 网络

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...