起
kubernetes 做为 PAAS 云的落地平台已经不是新闻了, 从 2016 年开始国内很多云厂纷纷开始做二次研发, 一些 IT 集团根据自己的业务需求, 自研适合自身业务的容器编排平台, 包括很多大客户的技术提供商, 也在为客户的业务应用做平台开发, 可巧笔者当初就曾用 ansible 写过 k8s 的自动部署脚本, 这算是第一次接触 k8s.
后来国内考 CKA 认证的技术人员越来越多, 到我考的时候已经有 5000 多号人了, 现在应该更多, CKA 认证基本已经成为从业人员的标配. 尽管 google 也好, rancher 也罢, 包括很多云厂商都有各自的部署工具, 但 CKA 考试还是要从开源版本学起, kubeadm 是源生的部署工具, 特别考试有一道 8 分的题, 就是在裸机上用 kubeadm 部署 k8s 集群. 即便不考认证, 如果你要从事容器云的相关工作, 个人认为也应该从开源版本学起.
再到后来有幸成为红旗教育学院的 k8s 讲师, 想将部署操作 k8s 的内容做下梳理, 故撰成此文. 此为第一回, 先说部署, 后续再慢慢加其它内容.
承
其实说到源生的 K8s 部署, 刚开始应该先从源码安装开始, 这个我也做过几回, 优点是能快速熟悉 kubernetes 架构和组件构成和组件与组件之前的耦合关系. 不过从易用性和可用性角度出发, 无论是测试还是上生产, 我想基本都不会考虑, 费时费力还一堆坑, 这个还是留待大伙学习, 或我哪天心情特别差的时候再说哈. 所以第一回先从 kubeadm 部署 k8s 集群开始.
小提示: kubernetes 为啥又叫 k8s, 是因为 k 与 s 之间有 8 个字母, 国人的简便称谓.....
好, 现在开始部署, 首先要准备最起码三台设备, 虚拟机也好, 物理机也罢, 这个随便, 建议配置如下:
机器配置: 2 核 CPU,8G 内存, 40G 系统盘
系统: Ubuntu 16.04.6 LTS
机器数量: 3 台 (master node01 node02)
当然了, 你要说内存 4G 行不行, 也可以, 一个测试不必要在这方面那么严谨, 至于为啥要用 Ubuntu, 这是 CNCF 社区的建议版本, 其实用 CentOS 也一样. 能把集群跑起来就算得~
接下来开始基础环境配置(3 台都要执行)
- (其实这部分属于 Linux 基础配置, 如果对 Linux 不熟请先自行补课, 当然在评论区问我也可以哈)
- (1) ### 修改配置静态 hostname
- hostnamectl set-hostname master1(node01,node02)
- (2)### hosts 表:
- 172.16.100.206 master
- 172.16.100.205 node01
- 172.16.100.204 node02
- (3)### 关闭 firewalld
- ufw disable
- (4)### 关闭 SELinux
Ubuntu 默认关闭 SELinux
(5)### 关闭 swap
临时关闭: swapoff -a
永久关闭: 注释掉 / etc/fstab 下的 swap 一行
如果使用 swap 会影响性能, 一般建议关闭, 当然你非要用也不是没有办法.
- (6)### 更新 apt 包索引
- apt-get update
这个是 Ubuntu 比较方便的地方, 随时更新随时新~~
- (7)### 安装软件包
- apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
这一步的作用是允许 apt 通过 HTTPS 使用存储库
- (8)### 安装 add-apt-repository 工具
- apt-get -y install software-properties-common
- (9)### 添加 Docker 的官方 GPG 密钥
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- (10)### 添加稳定的存储库
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
上两步的是为了安装 docker 做准备
- (11)### 查看 Docker 版本
- apt-cache madison docker-ce
现在已经到 19 版本了, 不过我测试还是用的 18.09.9
- (12)### 安装 docker-ce=5:18.09.9~3-0~Ubuntu-bionic
- apt-get -y install docker-ce=5:18.09.9~3-0~Ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~Ubuntu-xenial containerd.io
执行 docker info 进行验证
(13)### 解决 swap 报错
执行 docker info 命令在最后一层会出现:
WARNING: No swap limit support(操作系统下 docker 内存限制的警告)
执行命令, VIM /etc/default/grub 添加或编辑 GRUB_CMDLINE_LINUX 行以添加这键值:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"
更新 grub 并重启机器
- update-grub
- reboot
- (14)### 解决防火墙转发策略问题
docker 在 1.13 版本之后, 将系统 iptables 中 FORWARD 链的默认策略设置为 DROP, 并为连接到 docker0 网桥的容器添加了 ACCEPT 规则,
临时解决办法:
iptables -P FORWARD ACCEPT
永久解决办法:
VIM /lib/systemd/system/docker.service.
在 [Service] 下添加: ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
- (15)### 设置 daemon.JSON
- cat> /etc/docker/daemon.JSON <<EOF
- {
- "exec-opts": ["native.cgroupdriver=systemd"],
- "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/"],
- "log-driver": "json-file",
- "log-opts": {
- "max-size": "100m"
- },
- "storage-driver": "overlay2"
- }
- EOF
主要是配置 docker 的日志和拉取镜像源, registry-mirrorsr 使用国内阿里云的源, 这很重要, 因为如果不配置, 默认的源要能 *** 才能搞.
读取配置并重启服务
- systemctl daemon-reload && systemctl restart docker.service
- (16)### 安装 kubeadm,kubelet,kubectl
- sudo apt-get update && sudo apt-get install -y apt-transport-https curl
- sudo tee /etc/apt/sources.list.d/kubernetes.list
- deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
- EOF
还是一样, kubernetes 的源需要 ***, 所以依然用阿里的源, 其实搞了 k8s 才知道阿里云做了很多贡献.
默认安装最高版
- sudo apt-get update
- sudo apt-get install -y kubelet kubeadm kubectl
本锁定版本
- sudo apt-mark hold kubelet kubeadm kubectl
- (17)### 免密访问(master 节点)
- SSH-keygen -t rsa
- SSH-copy-id k8s-master
- SSH-copy-id k8s-node01
- SSH-copy-id k8s-node02
到此, 基础环境配置完成, 接下来开始正式部署.
转
情况是这样的, 测试环境只有一个 master, 所以是 single control-plane 的集群, 在在 master 节点执行
(1)### 初始化 control-plane 节点
生成配置文件
kubeadm config print init-defaults> init-defaults.YAML
kubeadm 工具提供部署 k8s 的默认配置, 可以输出为 YAML 文件, 但需要修改.
文件中的镜像源 imageRepository 为
k8s.gcr.io
安装时默认会从这个源下载镜像, 如果不 *** 无法下载, 故可事先将其改为:
registry.cn-hangzhou.aliyuncs.com/google_containers
在 networking 下修改 clusterName(集群名称), 修改 apiservice 地址
- localAPIEndpoint:
- advertiseAddress: 172.16.100.206
- clusterName: cluster01
- (2)### 执行初始化操作
- kubeadm init --config=init-defaults.YAML
或者
- kubeadm init \
- --kubernetes-version=v1.18.0 \
- --apiserver-advertise-address=172.16.100.206
部署现在 k8s 的最新版 1.18.0, 执行初始化操作时会先下载镜像, 也可以先下载再部署.
列出需下载镜像列表
kubeadm config images list
拉取镜像到本地
- kubeadm config images pull
- (3)### 初始化完成后马上需要做的
执行完初始化后, 会有提示如何添加 worker 节点, 与集群管理员帐户配置.
集群管理员帐户配置:
root 用户
- echo "export KUBECONFIG=/etc/kubernetes/admin.conf">> /root/.bashrc
- source /root/.bashrc
非 root 用户
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意, 将添加 worker 节点命令保存, 例如:
- kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
- --discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905
- (4)### 检查集群
检查组件状态是否正常
kubectl get componentstatuses
查看集群系统信息
kubectl cluster-info
检查支撑集群运行所有组件
kubectl -n kube-system get all
这些都是集群初始化完成后的基本操做, 至此初始化集群完成, 接下来开始配置集群.
结
初始化完成且, 需要对集群做配置才可以投入使用
(1)### 自动补全
为什么先做它, 是因为懒的原因, 这步操作可以将 kubectl 命令, 所有参数用 tab 健补全, 就像 Linux 一样:)
首先, 取消 bash-completion 注释
- VIM /etc/bash.bashrc
- enable bash completion in interactive shells
- if ! shopt -oq posix; then
- if [ -f /usr/share/bash-completion/bash_completion ]; then
- . /usr/share/bash-completion/bash_completion
- elif [ -f /etc/bash_completion ]; then
- . /etc/bash_completion
- fi
- fi
- source /etc/bash.bashrc
第二步是查看 completion 帮助
kubectl completion -h
可获取自动补全的命令
source <(kubectl completion bash)
如果执行一遍只是当前可用, 再登陆就不行了.
将 kubectl 自动补全添加到配置文件中, 可以在以后的 shell 中自动加载
- echo "source <(kubectl completion bash)">> ~/.bashrc
- source ~/.bashrc
- (2)### 配置网络
- kubectl apply -f
注, 在集群部署结束后, kube-system 命名空间内集群运行所需的所有控制器与 POD, 其中 coredns 是未 running 状态, 需要安装网络插件才能 running, 此步要在添加节点前执行.
(3)### 添加 work 节点
登陆两台 work 节点, 分别执行集群初始化完成时保存的内容, 例如:
- kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
- --discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905
如果没保存, 可以用命令生成再执行
创建 token
kubeadm token create
查看 token
kubeadm token list
获取 discovery-token-ca-cert-hash 值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.*//'
检查集群节点
kubectl get node
如果出现三台节点都是 ready 状态, 即表示成功, 如下所示:
- NAME STATUS ROLES AGE VERSION
- k8s-master Ready master 23h v1.18.2
- k8s-node01 Ready <none> 23h v1.18.2
- k8s-node02 Ready <none> 23h v1.18.2
- ### 重新初始化
如果部署遇到问题或报错, 需要重新初始化
kubeadm reset
注, master 与 work 节点都要执行
至此, k8s 集群部署完成, 很多人都说谁也无法保证 kubeadm 能一次部署成功. 基本上照着做的话成功率还是很高的, 如果能出现节点状态都 ready 的话, 就可以用了.
不过这里我只写了操作, 说实话想着没啥, 可写起来这么老多, 还牵扯很多 k8s 组件的运行原理和概念没说, 大伙要是看着还行, 可以留言讨论, 请期待下回, 谢谢.
来源: http://blog.51cto.com/robinzs/2497365