kubernetes 最复杂的就是认证和授权, 这次从头搭建另外一套 3 个虚机的 kubernetes, 还是通过 Vagrant 来进行搭建, 具体 Vagrant 的配置信息查看源码: https://github.com/limingios/msA-docker k8s 分支
预先环境准备
虚拟机介绍和安装
3 台虚拟机还是通过 Vagrant 来生成对应的虚拟机. Vagrant 已经安装了 对应的 docker.
系统类型 IP 地址节点角色 CPUMemoryHostnameCentos7192.168.68.101master24Gserver01Centos7192.168.68.102worker12Gserver02Centos7192.168.68.103worker12Gserver03
三台机器 Mac 开通远程登录 root 用户下
- # 设置 PasswordAuthentication yes
- vi /etc/SSH/sshd_config
sudo systemctl restart sshd
三台机器接受所有 ip 的数据包转发
- vi /lib/systemd/system/docker.service
- # 找到 ExecStart=xxx, 在这行上面加入一行, 内容如下:(k8s 的网络需要)
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
三台机器启动服务
systemctl daemon-reload
service docker restart
image.PNG
系统设置(所有节点)
关闭, 禁用防火墙(让所有机器之间都可以通过任意端口建立连接)
- systemctl stop firewalld
- systemctl disable firewalld
- # 查看状态
systemctl status firewalld
设置系统参数 - 允许路由转发, 不对 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
配置 host 文件
- # 配置 host, 使每个 Node 都可以通过名字解析到 ip 地址
- vi /etc/hosts
- # 加入如下片段(ip 地址和 servername 替换成自己的)
- 192.168.68.101 server01
- 192.168.68.102 server02
192.168.68.103 server03
准备二进制文件(所有节点)
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
解压 k8s, 改名
解压后, 改名成 bin 就是为了不在配置环境变量
tar -xvf kubernetes-bins.tar.gz
mv ~/kubernetes-bins/ bin
准备配置文件(所有节点)
上一步我们下载了 kubernetes 各个组件的二进制文件, 这些可执行文件的运行也是需要添加很多参数的, 包括有的还会依赖一些配置文件. 现在我们就把运行它们需要的参数和配置文件都准备好.
下载配置文件
- # 安装 Git
- yum -y install Git
- # 到 home 目录下载项目
- Git clone https://github.com/limingios/kubernetes-starter.git
- # 看看 Git 内容
cd ~/kubernetes-starter && ll
文件说明
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
- # 生成配置文件, 确保执行过程没有异常信息
生成配置(所有节点)
跟基础环境搭建一样, 我们需要生成 kubernetes-with-ca 的所有相关配置文件
# 生成配置
./gen-config.sh with-ca
PS: 这个截图 master_ip 应该是 192.168.68.101
安装 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
生成根证书(主节点)
根证书是证书信任链的根, 各个组件通讯的前提是有一份大家都信任的证书(根证书), 每个人使用的证书都是由这个根证书签发的.
- # 所有证书相关的东西都放在这
- 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
改造 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.pem
ls
更新 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
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.pem
ll
API-server 服务
生成 token 认证文件
- # 生成随机 token
- head -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
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
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
PS: 下次开始 kubectl,calico,cni,kube-proxy,kube-dns 的认证, 授权.
来源: https://juejin.im/post/5c74b4b95188255e53232046