六、安装 kubeadm、kubelet、kubectl
注意:Master 和 Node 节点都操作。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装 kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1,这样我们 Kubernetes 集群版本也对应会安装 v1.23.1 版本 yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 systemctl enable kubelet && systemctl start kubelet # 为了实现 docker 使用的 cgroupdriver 与 kubelet 使用的 Cgroup 的一致性 cat > /etc/sysconfig/kubelet << EOF KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" EOF
七、kubeadm 初始化 Kubernetes 集群
1.Master 节点操作
- 注意:安装 Kubernetes 时,我们对应组件镜像,如果没有科学上网是拉取不下来的,这里使用
--image-repository=registry.aliyuncs.com/google_containers
参数替换从默认镜像仓库拉取,改为 aliyun 镜像仓库。
# 查看 k8s 组件镜像 kubeadm config images list # 下载 k8s 组件镜像 kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.1 # 创建 k8s 集群(初始化) kubeadm init --kubernetes-version=v1.23.1 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
- 复制证书到
.kube
目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群;如果不这样做的话,我们每次都需要通过export KUBECONFIG
环境变量告诉 kubectl 这个安全配置文件的位置。
# 复制证书到 .kube 目录下 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.Node 节点操作
- Master 节点执行,生成 bootstrap-token,非安全模式连接 Master 节点。
$ kubeadm token create --print-join-command kubeadm join 192.168.200.15:6443 --token ylls57.b0gfk6o9zq5wslgc --discovery-token-ca-cert-hash sha256:c16a38026f66381f5911f1fdbe44220069b969b83174486e5b602c11646b0a51
- Node 节点执行,上诉生成的 bootstrap-token,连接 Master 节点,加入集群。
kubeadm join 192.168.200.15:6443 --token ylls57.b0gfk6o9zq5wslgc --discovery-token-ca-cert-hash sha256:c16a38026f66381f5911f1fdbe44220069b969b83174486e5b602c11646b0a51
3.部署网络插件
注意:Master 节点操作
通过 kubectl get
命令查看集群节点状态和 所以 Pod 状态,如图:可以看到 Node 节点 STATUS NotReady (未就绪)而 Pod coredns 的状态是 Pending ,这是为什么呢?
- 在调试 Kubernetes 集群时,最重要的手段就是用
kubectl describe
命令来查看这个节点对象的详细信息、状态和事件(Event):
NotReady 和 Pending 的原因在于:我们尚未部署任何网络插件。
部署网络插件,以 flannel 为例:
yum install -y wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
部署完成后,我们在次查看 Node 和 coredns Pod 的状态:
[root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION localhost.localdomain Ready <none> 12m v1.23.1 master Ready control-plane,master 80m v1.23.1 [root@master ~]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-7dchq 1/1 Running 0 4m kube-flannel kube-flannel-ds-w7kh9 1/1 Running 0 4m kube-system coredns-6d8c4cb4d-9tkz5 1/1 Running 0 82m kube-system coredns-6d8c4cb4d-q4jcx 1/1 Running 0 64m kube-system etcd-master 1/1 Running 0 82m kube-system kube-apiserver-master 1/1 Running 0 82m kube-system kube-controller-manager-master 1/1 Running 0 82m kube-system kube-proxy-4vpws 1/1 Running 0 82m kube-system kube-proxy-ss7xr 1/1 Running 0 14m kube-system kube-scheduler-master 1/1 Running 0 82m
Kubernetes 支持容器网络插件,使用的是一个名叫 CNI 的通用接口,它也是当前容器网络的事实标准,市面上的所有容器网络开源项目都可以通过 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等
八、部署 Dashboard 可视化插件
下载 Dashboard 的 YAML 文件
官方 GitHub下载地址:https://github.com/kubernetes/dashboard/releases
# 下载 dashboard 的 recommended.yaml wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
下载后 vi 或 vim,编辑 recommended.yaml 在 Service 服务名为:kubernetes-dashboard
的指定位置,添加 NodePort
方式访问 Dashbaord ,如图:
部署 dashboard,这里需要等待 2 分钟左右,拉取镜像时间,可以使用 kubectl get pod -A
查看 dashbaord 的 Pod 是否运行了。
kubectl apply -f recommended.yaml
获取 token 值,这个 token 值登录 dashboard 时需要使用:
kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard | grep kubernetes-dashboard-token | awk '{print $1}')
浏览器访问
注意:这里默认使用的是 https 协议,不是 http 协议。
查看 dashbaord 的 service 服务提供的端口,这里为:31080。所以,浏览器输入:https://192.168.200.15:31080
(格式:https://宿主机ip:31080)
[root@master test]# kubectl get service -A | grep kubernetes-dashboard kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.99.233.125 <none> 8000/TCP 43m kubernetes-dashboard kubernetes-dashboard NodePort 10.98.222.55 <none> 443:31080/TCP 43m
- 访问时出现下列错误
解决方法是:保持焦点在页面内,鼠标在页面空白处点击(不选中任何按钮),直接输入“thisisunsafe”,输完后按回车键,就可以正常访问网页。
这里要注意的是,输入的时候页面时不会有任何反应的,也不会显示输入的字符,是正常现象。输入完毕后点回车即可。
- 输入前面获取的 token 值,登录即可。
进入 Dashbaord 最终界面:
九、部署存储插件
为了实现容器持久化存储,我们这里部署 Rook 项目。
- Rook 项目是一个基于 Ceph 的 Kubernetes 存储插件。Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理。
容器的持久化存储,就是用来保存容器存储状态的手段。存储插件为容器提供远程数据卷,使得容器里面的数据,被保存在远程存储服务器的磁盘中,或者以分布式的方式保存在多个节点上,而与当前宿主机的存储没有任何绑定关系。
这样无论你在哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。
部署 ROOK
ROOK 官网:https://rook.io/
官网下载地址:https://github.com/rook/rook/releases
# 如果 git 不下来,就使用上述提供的官网下载地址,下载 tar 包,后上传解压。 git clone --single-branch --branch v1.11.6 https://github.com/rook/rook.git cd rook/deploy/examples kubectl create -f crds.yaml -f common.yaml -f operator.yaml [root@master examples]# kubectl -n rook-ceph get pod NAME READY STATUS RESTARTS AGE rook-ceph-operator-585f6875d-4fqx2 1/1 Running 0 8m52s [root@master examples]# kubectl get -f operator.yaml NAME DATA AGE configmap/rook-ceph-operator-config 31 9m6s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/rook-ceph-operator 1/1 1 1 9m6s
现在 Rook operator 正在运行,我们可以创建 Ceph 集群。
kubectl create -f cluster.yaml
总结
今天介绍了,使用 kubeadm 部署 Kubernetes 集群,可以发现其实并不复杂。
重点简述了 kubeadm 初始化集群部分。
Rook 是很有前途的项目,合理的使用了很多,如: Operator、CRD 等重要的扩展特性。大家可以先去了解一下这个项目。
最后,今天我们从 0 到 1 搭建 kubernetes 集群就算是介绍完了。
如有不对的地方,欢迎各位大佬指正。