『高级篇』docker之kubernetes搭建集群添加认证授权(上)(38)
2019-02-26 14:17:02
李明
  • 访问次数: 375
  • 注册日期: 2018-07-09
  • 最后登录: 2019-08-08

原创文章,欢迎转载。转载请注明:转载自 IT人故事会 ,谢谢!原文链接地址: 『高级篇』docker之kubernetes搭建集群添加认证授权(上)(38)

kubernetes最复杂的就是认证和授权,这次从头搭建另外一套3个虚机的kubernetes,还是通过vagrant来进行搭建,具体vagrant的配置信息查看源码: https://github.com/limingios/msA-docker k8s分支


v2-46373d78f34ba1c3cde522b8aa13a6ca_hd.p

预先环境准备

  • 虚拟机介绍和安装

3台虚拟机还是通过vagrant来生成对应的虚拟机。vagrant已经安装了 对应的docker。

系统类型IP地址节点角色CPUMemoryHostnameCentos7192.168.68.101master24Gserver01Centos7192.168.68.102worker12Gserver02Centos7192.168.68.103worker12Gserver03

  • 三台机器mac开通远程登录root用户下

#设置 PasswordAuthentication yesvi /etc/ssh/sshd_config
sudo systemctl restart sshd


v2-b2dd3d71d0f6b619bad31849b23805dc_hd.p


v2-1a9ff26741535930dea83bddee1ee548_hd.p


v2-71e3f1ac4a0fd83eb1f7c1cd6c9297e2_hd.p

  • 三台机器接受所有ip的数据包转发

vi /lib/systemd/system/docker.service   
#找到ExecStart=xxx,在这行上面加入一行,内容如下:(k8s的网络需要)ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT


v2-4e864a3853b2cb7ac1d113c1d5899dc4_hd.p


v2-cac5eb420ea620d0858d1c888c6ae315_hd.p


v2-ef1f1b10dab489a4fb5da45c00127c02_hd.p

  • 三台机器启动服务

systemctl daemon-reload
service docker restart


v2-26e65bf03781c11d3dd28934d96c97fa_hd.p

image.png


v2-4291c8e26ef317605cf91d11140ddd32_hd.p


v2-bddd47cbdd93905d936d9e53ec8bd422_hd.p

系统设置(所有节点)

关闭、禁用防火墙(让所有机器之间都可以通过任意端口建立连接)

systemctl stop firewalld
systemctl disable firewalld#查看状态systemctl status firewalld


v2-675ed9e01bd94c8b2d4ae2cae26f0605_hd.p


v2-16b3a42ff3f155b1b46d1b64e0c969e9_hd.p


v2-7c09eee43ffd8dd6cd376d87ccbe18bf_hd.p

设置系统参数 - 允许路由转发,不对bridge的数据进行处理

#写入配置文件cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF 
#生效配置文件sysctl -p /etc/sysctl.d/k8s.conf


v2-d0f81e22a2f85d1972a78a0b9e400dc9_hd.p


v2-54d9d43cec5bffbc7f06984c1d1c42c0_hd.p


v2-c43bcb478ee3c27dfa05801b22430a87_hd.p

配置host文件

#配置host,使每个Node都可以通过名字解析到ip地址vi /etc/hosts#加入如下片段(ip地址和servername替换成自己的)192.168.68.101 server01
192.168.68.102 server02
192.168.68.103 server03


v2-36d3a8a05b478fd2ba3d9c2513b171d2_hd.p


v2-d97ce551e0976b4c5554ac8badedc852_hd.p


v2-107f4b418907aa02eb248deec8f3f634_hd.p

准备二进制文件(所有节点)

kubernetes的安装有几种方式,不管是kube-admin还是社区贡献的部署方案都离不开这几种方式:

  • 使用现成的二进制文件

直接从官方或其他第三方下载,就是kubernetes各个组件的可执行文件。拿来就可以直接运行了。不管是centos,ubuntu还是其他的linux发行版本,只要gcc编译环境没有太大的区别就可以直接运行的。使用较新的系统一般不会有什么跨平台的问题。

  • 使用源码编译安装

编译结果也是各个组件的二进制文件,所以如果能直接下载到需要的二进制文件基本没有什么编译的必要性了。

  • 使用镜像的方式运行

同样一个功能使用二进制文件提供的服务,也可以选择使用镜像的方式。就像nginx,像mysql,我们可以使用安装版,搞一个可执行文件运行起来,也可以使用它们的镜像运行起来,提供同样的服务。kubernetes也是一样的道理,二进制文件提供的服务镜像也一样可以提供。

从上面的三种方式中其实使用镜像是比较优雅的方案,容器的好处自然不用多说。但从初学者的角度来说容器的方案会显得有些复杂,不那么纯粹,会有很多容器的配置文件以及关于类似二进制文件提供的服务如何在容器中提供的问题,容易跑偏。所以我们这里使用二进制的方式来部署。二进制文件已经这里备好,大家可以打包下载,把下载好的文件放到每个节点上,放在哪个目录随你喜欢, 放好后最好设置一下环境变量$PATH ,方便后面可以直接使用命令。(科学上网的老铁也可以自己去官网找找)

[下载地址(kubernetes 1.9.0版本)] ( https://pan.baidu.com/s/1bMnqWY )

  • 将下载的k8s上传到linux服务器上

密码都是vagrant

yum -y install lrzsz#选中文件上传就可以了,这次是在windows环境,上次基础搭建是在mac上rz


v2-5e7cf33aa6a307ea5befcae903462c14_hd.p


v2-7c232f09c4336fe5a2709918e95c2f6c_hd.p


v2-51fb69575d8c4d4f4716224f06a7cbd5_hd.p

  • 解压k8s,改名

解压后,改名成bin就是为了不在配置环境变量

tar -xvf kubernetes-bins.tar.gz 
mv ~/kubernetes-bins/ bin


v2-01c4afed814b30394ae262ebf5f145a0_hd.p


v2-07bfc8433efb83c73831f511eab2b6b7_hd.p


v2-92b271ffb9f74b7a0b7b069a2acd1a4f_hd.p

准备配置文件(所有节点)

上一步我们下载了kubernetes各个组件的二进制文件,这些可执行文件的运行也是需要添加很多参数的,包括有的还会依赖一些配置文件。现在我们就把运行它们需要的参数和配置文件都准备好。

下载配置文件

#安装gityum -y install git#到home目录下载项目git clone https://github.com/limingios/kubernetes-starter.git#看看git内容cd ~/kubernetes-starter && ll


v2-bedd610d4d3f32ff9aad8396256928ef_hd.p


v2-62174bcbbaf26edde9818819a546c6d8_hd.p


v2-3da51cc3b37ad05a37df27b4eac1b37f_hd.p

文件说明

  • gen-config.sh

shell脚本,用来根据每个老铁自己的集群环境(ip,hostname等),根据下面的模板,生成适合大家各自环境的配置文件。生成的文件会放到target文件夹下。

  • kubernetes-simple

简易版kubernetes配置模板(剥离了认证授权)。适合刚接触kubernetes的老铁,首先会让大家在和kubernetes初次见面不会印象太差(太复杂啦~~),再有就是让大家更容易抓住kubernetes的核心部分,把注意力集中到核心组件及组件的联系,从整体上把握kubernetes的运行机制。

  • kubernetes-with-ca

在simple基础上增加认证授权部分。大家可以自行对比生成的配置文件,看看跟simple版的差异,更容易理解认证授权的(认证授权也是kubernetes学习曲线较高的重要原因)

  • service-config

这个先不用关注,它是我们曾经开发的那些微服务配置。等我们熟悉了kubernetes后,实践用的,通过这些配置,把我们的微服务都运行到kubernetes集群中。

3台机器生成配置

这里会根据大家各自的环境生成kubernetes部署过程需要的配置文件。在每个节点上都生成一遍,把所有配置都生成好,后面会根据节点类型去使用相关的配置。

#cd到之前下载的git代码目录cd ~/kubernetes-starter#编辑属性配置(根据文件注释中的说明填写好每个key-value)vi config.properties#生成配置文件,确保执行过程没有异常信息


v2-f723b925688e03b6893827461de9c36c_hd.p



v2-d217078337c9f2b285e8cb6814a5421f_hd.p


v2-77e762fd2f6f2be09a69391d5a7bef01_hd.p

生成配置(所有节点)

跟基础环境搭建一样,我们需要生成kubernetes-with-ca的所有相关配置文件

#生成配置./gen-config.sh with-ca


v2-fd0b0449d49c5f683946276821bf5562_hd.p


PS:这个截图master_ip应该是192.168.68.101


v2-67efa54a7ae833058cc1319d566a8a8e_hd.p


v2-a6ef86c05fa6c87e0e84c9ca9a53f978_hd.p

安装cfssl(所有节点)

cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件安装过程比较简单,

#下载
  wget  https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
  https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64#修改为可执行权限chmod +x cfssl_linux-amd64 cfssljson_linux-amd64#移动到bin目录mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson#验证cfssl version


v2-e77456cce8a7cbdd72ed9fc4473416a1_hd.p


v2-4ced2c06d52eae5ad56acfb3d99589c5_hd.p


v2-b0efce7781f0da8e7d54bc7198ede936_hd.p

生成根证书(主节点)

根证书是证书信任链的根,各个组件通讯的前提是有一份大家都信任的证书(根证书),每个人使用的证书都是由这个根证书签发的。

#所有证书相关的东西都放在这mkdir -p /etc/kubernetes/ca#准备生成证书的配置文件cp ~/kubernetes-starter/target/ca/ca-config.json /etc/kubernetes/ca
cp ~/kubernetes-starter/target/ca/ca-csr.json /etc/kubernetes/ca#生成证书和秘钥cd /etc/kubernetes/ca
cfssl gencert -initca ca-csr.json | cfssljson -bare ca#生成完成后会有以下文件(我们最终想要的就是ca-key.pem和ca.pem,一个秘钥,一个证书)ls


v2-0e41bb54a03ace52fc6199ba6ae0c062_hd.p

改造etcd(主节点)

准备证书

etcd节点需要提供给其他服务访问,就要验证其他服务的身份,所以需要一个标识自己监听服务的server证书,当有多个etcd节点的时候也需要client证书与etcd集群其他节点交互,当然也可以client和server使用同一个证书因为它们本质上没有区别。

#etcd证书放在这mkdir -p /etc/kubernetes/ca/etcd#准备etcd证书配置cp ~/kubernetes-starter/target/ca/etcd/etcd-csr.json /etc/kubernetes/ca/etcd/
cd /etc/kubernetes/ca/etcd/#使用根证书(ca.pem)签发etcd证书cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes etcd-csr.json | cfssljson -bare etcd#跟之前类似生成三个文件etcd.csr是个中间证书请求文件,我们最终要的是etcd-key.pem和etcd.pemls


v2-7302feee4675a358df2e91c08dbc5d9e_hd.p

更新etcd服务:

cp ~/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/
mkdir -p /var/lib/etcd
systemctl enable etcd.service
systemctl daemon-reload
service etcd start#验证etcd服务(endpoints自行替换)ETCDCTL_API=3 etcdctl \
  --endpoints=https://192.168.68.101:2379  \
  --cacert=/etc/kubernetes/ca/ca.pem \
  --cert=/etc/kubernetes/ca/etcd/etcd.pem \
  --key=/etc/kubernetes/ca/etcd/etcd-key.pem \
  endpoint health


v2-b37aaf8f1f24e957179825a8de66673f_hd.p


v2-00889e05cd0b1c6065854826f3298f0a_hd.p

api-server(主节点)

准备证书

#api-server证书放在这,api-server是核心,文件夹叫kubernetes吧,如果想叫apiserver也可以,不过相关的地方都需要修改哦mkdir -p /etc/kubernetes/ca/kubernetes#准备apiserver证书配置cp ~/kubernetes-starter/target/ca/kubernetes/kubernetes-csr.json /etc/kubernetes/ca/kubernetes/
cd /etc/kubernetes/ca/kubernetes/#使用根证书(ca.pem)签发kubernetes证书cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes#跟之前类似生成三个文件kubernetes.csr是个中间证书请求文件,我们最终要的是kubernetes-key.pem和kubernetes.pemll


v2-d0b83d48bff870d676cfa174f77c16f5_hd.p

api-server服务

生成token认证文件

#生成随机tokenhead -c 16 /dev/urandom | od -An -t x | tr -d ' '
0b1bd95b94caa5534d1d4a7318d51b0e#按照固定格式写入token.csv,注意替换token内容echo "0b1bd95b94caa5534d1d4a7318d51b0e,kubelet-bootstrap,10001,\"system:kubelet-bootstrap\"" > /etc/kubernetes/ca/kubernetes/token.csv

更新api-server服务

cp ~/kubernetes-starter/target/master-node/kube-apiserver.service /lib/systemd/system/
systemctl daemon-reload
service kube-apiserver start#检查日志journalctl -f -u kube-apiserver
cat /lib/systemd/system/kube-apiserver.service


v2-267a613f38542ba06ae406e8595b387b_hd.p


v2-02c77a94ad0e7822d07439d772d4f2a2_hd.p

controller-manager

controller-manager一般与api-server在同一台机器上,所以可以使用非安全端口与api-server通讯,不需要生成证书和私钥。

controller-manager服务

更新controller-manager服务

cd ~/kubernetes-starter/
cp ~/kubernetes-starter/target/master-node/kube-controller-manager.service /lib/systemd/system/
systemctl daemon-reload
service kube-controller-manager start#检查日志journalctl -f -u kube-controller-manager
cat /lib/systemd/system/kube-controller-manager.service


v2-22114dcc85191c786bd93039cbed0f9e_hd.p


v2-9557e62b1739e5aa5eaf117d42421cb1_hd.p

scheduler

scheduler一般与apiserver在同一台机器上,所以可以使用非安全端口与apiserver通讯。不需要生成证书和私钥。

scheduler服务

查看diff比较会发现两个文件并没有区别,不需要改造

cd ~/kubernetes-starter/
cp ~/kubernetes-starter/target/master-node/kube-scheduler.service /lib/systemd/system/
systemctl enable kube-scheduler.service

启动服务

service kube-scheduler start#检查日志journalctl -f -u kube-scheduler
cat /lib/systemd/system/kube-scheduler.service


v2-0317865cd388d19c8aa17b6518e703f9_hd.p


v2-ebd11b7395f47decc73e81f9126cc778_hd.p

PS:下次开始kubectl,calico,cni,kube-proxy,kube-dns的认证,授权。


v2-5e0719d9fc7dd03ce32e624534c0b631_hd.p