一、Openssl自签TLS证书配置
kubernetes集群组件分布
组件 | 版本 | 下载地址 |
---|---|---|
etcd | 3.3.10 | https://github.com/etcd-io/etcd/releases |
kube-apiserver | 1.4.2 | https://storage.googleapis.com/kubernetes-release/release/v1.14.2/kubernetes-server-linux-amd64.tar.gz |
kube-controller-manager | 1.4.2 | |
kube-scheduler | 1.4.2 | |
kubelet | 1.4.2 | https://storage.googleapis.com/kubernetes-release/release/v1.14.2/kubernetes-node-linux-amd64.tar.gz |
kube-proxy | 1.4.2 | |
calicoctl | 3.7.2 | https://github.com/projectcalico/calicoctl/releases |
证书介绍
证书名称 | 配置文件 | 用途 |
---|---|---|
ca-config.pem | ca-config.json | 证书有效期描述 |
ca.pem | ca-csr.json | k8s 根 CA 证书 |
etcd.pem | etcd-csr.json | etcd 集群证书 |
kubernetes.pem | kubernetes-csr.json | kube-apiserver 使用的证书 |
admin.pem | admin-csr.json | kubectl 使用的证书 |
kube-proxy.pem | kube-proxy-csr.json | kube-proxy 使用的证书 |
cfssl 工具安装
1 | [admin@haifly-bj-dev-k8s-master1 adimin] mkdir -p kubenetes/cfssl |
1.配置证书生成策略
2.创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
3.生成CA证书和私钥(root 证书和私钥)
4.分发证书
创建认证中心(CA)
CFSSL可以创建一个获取和操作证书的内部认证中心。
运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要。
1.配置证书生成策略
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat <<EOF>> ca-config.json |
这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是kubernetes,也可以是其他用途的比如说etcd等。
默认策略,指定了证书的有效期是一年(8760h)
kubernetes策略,指定了证书的用途
signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
2.创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat <<EOF>> ca-csr.json |
CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
C: Country, 国家
L: Locality,地区,城市
O: Organization Name,组织名称,公司名称
OU: Organization Unit Name,组织单位名称,公司部门
ST: State,州,省
3.生成CA证书和私钥(root 证书和私钥)
ca证书:ca.pem 私钥:ca-key.pem 初始化CA cfssl gencert -initca ca-csr.json | cfssljson -bare ca
这个命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
注意: 使用现有的CA私钥,重新生成:
1 | ``` |
3.1 查看cert(证书信息):
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl certinfo -cert ca.pem |
3.2 查看CSR(证书签名请求)信息:
1 | cfssl certinfo -csr ca.csr |
4.分发证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cp ca.pem ca-key.pem /work/admin/kubernetes/ssl/ |
二、搭建三节点的etcd集群
搭建步骤:
- 准备安装包
- 创建etcd签名请求:
- 生成etcd证书和私钥
- 分发etcd的证书
- 设置ETCD配置文件
- 配置完后启动etcd
- 查看状态集群的状态是否正常
1.准备安装包
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ ll ~/kubernetes/bin/ |
2.创建etcd签名请求
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat <<EOF>> etcd-csr.json |
3.生成etcd证书和私钥
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl gencert -ca=/work/admin/kubernetes/cfssl/ca.pem \ |
4.分发etcd证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cp etcd*.pem ~/kubernetes/ssl/ |
5.设置etcd配置文件
设置etcd的配置有两种方式:
- 所有的配置都写在service文件中
- 配置文件写在
/ect/kubernetes/cfg
中,然后在service文件中加上配置的地址
下面我把两种方式的实现都写出来
5.1 配置方法1
先配置etcd.conf 注意:除了ETCD_INITIAL_CLUSTER
不改变外,剩下的其他地方涉及到了ip地址的,都需要替换成相应node的ip地址。 另外,要注意ETCD_NAME
要和下面的ETCD_INITIAL_CLUSTER
中描述的名字对应上。
1 | [admin@haifly-bj-dev-k8s-master1 cfg]$ pwd |
再在服务文件中将配置加上去
1 | [admin@haifly-bj-dev-k8s-master1 cfg]$ cat /etc/systemd/system/etcd.service |
5.2 配置方法2
注意:除了initial-cluster
不改变外,剩下的其他地方涉及到了ip地址的,都需要替换成相应node的ip地址
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ cat /usr/lib/systemd/system/etcd.service |
6.启动etcd
注意,配置完第一个先不着急启动,等其他两个节点的配置完成后,三个节点同时启动etcd,否则第一个节点先启动时会一直夯在那儿。
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ sudo systemctl daemon-reload |
7.查看etcd集群状态
master1(etcd-node1)的状态
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ systemctl status etcd |
master2(etcd-node2)的状态
1 | [admin@haifly-bj-dev-k8s-master2 ~]$ systemctl status etcd |
node1(etcd-node3)的状态
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ systemctl status etcd |
8.用命令查看集群状态
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ ~/kubernetes/bin/etcdctl --endpoints=https://192.168.9.148:2379,https://192.168.9.149:2379,https://192.168.9.150:2379 \ |
这里小小的调优一下etcd timeout时间(默认100ms)
~/kubernetes/bin/etcd –heartbeat-interval=100 –election-timeout=500
# 环境参数:
ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd
三、部署master节点
1.准备安装包
2.创建生成kubernetes的CSR的 JSON 配置文件
3.生成 kubernetes 证书和私钥
4.分发证书
5.配置 kube-apiserver
5.1 创建 kube-apiserver 使用的客户端 token 文件
5.2 创建基础用户名/密码认证配置(abac)
5.3 部署kube-apiserver服务
5.4 启动kube-apiserver服务
5.5 查看kube-apiserver服务状态
6.配置kube-controller-manager
6.1 部署kube-controller-manager服务
6.2 启动kube-controller-manager服务
6.3 查看kube-controller-manager服务状态
7.配置kube-scheduler
7.1 部署kube-scheduler服务
7.2 启动 kube-scheduler 服务
7.3 查看 kube-scheduler 状态
1.准备安装包
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ ll ~/kubernetes/bin/ |
2.创建生成kubernetes的CSR的 JSON 配置文件
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ cd kubernetes/cfssl/ |
3.生成kubernetes证书和私钥
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl gencert -ca=/work/admin/kubernetes/cfssl/ca.pem \ |
4.分发证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cp kubernetes*.pem ~/kubernetes/ssl/ |
5.配置 kube-apiserver
5.1创建kube-apiserver使用的客户端token文件
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ head -c 16 /dev/urandom | od -An -t x | tr -d ' ' |
5.2 部署kube-apiserver服务
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat /etc/systemd/system/kube-apiserver.service |
5.3 启动kube-apiserver
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ sudo systemctl daemon-reload |
6.配置kube-controller-manager
6.1部署kube-controller-manager
1 | [admin@haifly-bj-dev-k8s-master1 ssl]$ cat /etc/systemd/system/kube-controller-manager.service |
--master=http://{MASTER_IP}:8080
:使用非安全 8080 端口与 kube-apiserver 通信;--cluster-cidr
指定 Cluster 中 Pod 的 CIDR 范围,该网段在各 Node 间必须路由可达(flanneld保证);--service-cluster-ip-range
参数指定 Cluster 中 Service 的CIDR范围,该网络在各 Node 间必须路由不可达,必须和 kube-apiserver 中的参数一致;--cluster-signing-*
指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥;--root-ca-file
用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件;--leader-elect=true
部署多台机器组成的 master 集群时选举产生一处于工作状态的kube-controller-manager
进程;
6.2启动kube-controller-manager
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ sudo systemctl daemon-reload |
6.3查看kube-controller-manager服务状态
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ systemctl status kube-controller-manager |
7.配置kube-scheduler
7.1部署kube-scheduler服务
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat /etc/systemd/system/kube-scheduler.service |
7.2启动kube-scheduler服务
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ sudo systemctl daemon-reload |
7.3查看kube-scheduler状态
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ systemctl status kube-scheduler |
四、部署kubectl工具
1.准备二进制文件
2.创建 admin 证书签名请求
3.生成admin证书
4.分发证书
5.配置kubectl的使用的config
5.1 设置集群参数
5.2 设置客户端认证参数
5.3 设置上下文参数
5.4 设置默认上下文
6.使用kubectl查看当前的资源情况
1.准备二进制文件
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ ll ~/kubernetes/bin/ |
2.创建admin证书签名
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat <<EOF>> admin-csr.json |
3.生成admin证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl gencert -ca=/work/admin/kubernetes/cfssl/ca.pem \ |
4.分发证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cp admin*.pem ~/kubernetes/ssl/ |
5.配置kubectl的config
因为rbac认证的原因,默认会内置一些角色,可以查看admin-crs.json中的"O": "system:masters"
5.1设置集群参数
先把kubectl命令添加到系统PATH路径下
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-cluster kubernetes \ |
5.2设置客户端认证参数
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-credentials admin \ |
5.3设置上下文参数
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-context kubernetes \ |
5.4设置默认上下文
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config use-context kubernetes |
以上所有的操作的最终目的是为了生成 ~/.kube/config文件,如果node节点想使用kubectl的话,就需要将相应的admin*.pem
拷贝到/etc/kubernetes/ssl
目录,以及拷贝一份 ~/.kube/config
文件
6.使用kubectl 查看当前资源情况
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl get cs |
五、部署node节点
1.安装docker环境
1.1.安装一些必要的系统工具
1.2.添加docker镜像源
1.3.安装需要的版本
1.4.把当前用户加入docker用户组
1.5.修改配置文件
1.6.启动docker服务
1.7.查看docker确保没有info类信息
2.准备工作
2.1. 准备node节点的kubelet和kube-proxy二进制包
2.2.创建角色绑定
2.3.创建 用于kubelet的kubeconfig 文件
3.部署kubelet
3.1.创建kubelet工作目录
3.2.创建kubelet服务
3.3.启动kubelet服务
3.4.查看kubelet服务状态
3.5.在master节点查看csr请求
3.6.在master节点通过kubelet 的 TLS 证书请求
4.配置kube-proxy
4.1.安装kube-proxy使用LVS需要的包
4.2.创建 kube-proxy 证书请求的json
4.3.生成kube-proxy证书
4.4.分发证书
4.5.创建kube-proxy配置文件
4.6.创建kube-proxy的工作目录
4.7.创建kube-proxy服务配置
4.8.启动kube-proxy服务
4.9.查看kube-proxy服务状态
4.10.检查LVS状态
1.安装docker环境
1.1.安装一些必要的系统工具
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
1.2.添加docker镜像源
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
1.3.安装需要的版本
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ yum list docker-ce --showduplicates |sort -r |
1.4.把当前用户加入docker用户组
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo groupadd docker |
1.5.修改配置文件
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo mkdir /etc/docker |
1.6.启动docker服务
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo systemctl daemon-reload |
1.7.查看docker确保没有info类信息
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ docker info |
WARNING类的告警需要解决掉
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo vim /etc/sysctl.conf |
2.准备工作
2.1准备node节点的kubelet和kube-proxy二进制包
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ ll kubernetes/bin/ |
2.2创建角色绑定
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap |
2.3创建用于kubelet的kubeconfig文件
2.3.1设置集群参数
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl config set-cluster kubernetes \ |
2.3.2设置客户端认证参数
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl config set-credentials kubelet-bootstrap \ |
该token串是之前配置kube-apiserver使用的客户端token文件
2.3.3设置上下文参数
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl config set-context default \ |
2.3.4选择默认上下文
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl config use-context default --kubeconfig=bootstrap.kubeconfig |
2.3.5将当前目录生成的 bootstrap.kubeconfig
分发到node节点上
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ scp bootstrap.kubeconfig admin@192.168.10.177:~/kubernetes/ssl/ |
3.部署kubelet
3.1创建kubelet工作目录
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ mkdir ~/kubernetes/kubelet/ |
3.2创建kubelet服务
这里做了一些优化,node主机资源预留,在node资源不足时能够自动驱逐pod到其它节点
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ cat /usr/lib/systemd/system/kubelet.service |
- –hostname-override 在集群中显示的主机名
- –kubeconfig 指定kubeconfig文件位置,会自动生成
- –bootstrap-kubeconfig 指定刚才生成的bootstrap.kubeconfig文件
- –cert-dir 颁发证书存放位置
- –pod-infra-container-image 管理Pod网络的镜像
3.3启动kubelet服务
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo systemctl daemon-reload |
3.4查看kubelet服务状态
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ systemctl status kubelet |
3.5在master节点查看csr请求
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl get csr |
3.6在master节点通过kubelet的TLS证书请求
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve |
4.配置kube-proxy
4.1安装kube-proxy使用LVS需要的包
注意:如果不使用lvs的话,就会使用iptables,这个是1.10版本的新特性
1 | [admin@haifly-bj-dev-k8s-master1 ~]$ sudo yum install -y ipvsadm ipset conntrack |
4.2创建kube-proxy证书请求的json
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cat <<EOF>> kube-proxy-csr.json |
4.3生成kube-proxy证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ cfssl gencert -ca=/work/admin/kubernetes/cfssl/ca.pem \ |
4.4分发证书
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ scp kube-proxy*.pem admin@192.168.10.177:~/kubernetes/ssl/ |
4.5创建kube-proxy配置文件
4.5.1创建集群信息
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-cluster kubernetes \ |
4.5.2配置认证信息
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-credentials kube-proxy \ |
4.5.3设置上下文环境
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config set-context default \ |
4.5.4配置默认的上下文
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig |
4.5.5分发kube-proxy.kubeconfig到node节点
1 | [admin@haifly-bj-dev-k8s-master1 cfssl]$ scp kube-proxy.kubeconfig admin@192.168.10.177:~/kubernetes/ssl/ |
4.6创建kube-proxy工作目录
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ mkdir ~/kubernetes/kube-proxy |
4.7创建kube-proxy服务配置
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ cat /usr/lib/systemd/system/kube-proxy.service |
--hostname-override
参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则--cluster-cidr
必须与 kube-controller-manager 的--cluster-cidr
选项值一致,10.1.0.0/16- kube-proxy 根据
--cluster-cidr
判断集群内部和外部流量,指定--cluster-cidr
或--masquerade-all
选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT --kubeconfig
指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息- 预定义的 RoleBinding
cluster-admin
将Usersystem:kube-proxy
与 Rolesystem:node-proxier
绑定,该 Role 授予了调用kube-apiserver
Proxy 相关 API 的权限
4.8启动kube-proxy服务
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo systemctl daemon-reload |
4.9查看kube-proxy服务状态
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ systemctl status kube-proxy |
六、部署kubernetes网络(calico)k8s容器方式
1.准备工作
1 | 1.1.下载calicoctl工具 |
2.部署calico
2.1.创建calico容器
2.2.查看容器运行状态
2.3.查看calico网络状态
2.4.修改kubelet配置,支持cni网络插件
1.准备工作
1.1下载calicoctl工具
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ cd ~/kubernetes/bin/ |
1.2下载安装文件
1 | [admin@haifly-bj-dev-k8s-master1 bin]$ mkdir ~/kubernetes/calico |
1.3拉取calico所需镜像
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ docker pull calico/cni:v3.7.2 |
1.4修改calico.yaml文件
我装的calico是最新版本3.7.2,yaml文件跟以前也差不多,修改以下几行内容
1 | 17 etcd-key: (cat /work/admin/kubernetes/ssl/etcd-key.pem | base64 | tr -d '\n') |
2.部署calico
2.1创建calico容器
1 | [admin@haifly-bj-dev-k8s-master1 calico]$ kubectl create -f calico-etcd.yaml |
2.2.查看容器运行状态
1 | [admin@haifly-bj-dev-k8s-master1 calico]$ kubectl get pod -o wide -n kube-system |
2.3.查看calico网络状态
1 | [admin@haifly-bj-dev-k8s-node1 ~]$ sudo ~/kubernetes/bin/calicoctl node status |