本文是 Kubernetes 系列的第二篇文章,在第一篇中主要是了解一下容器的历史,这一篇文章开始真正得了解一下 Kubernetes,当然,我是注重理论和实操结合的人,所以肯定得先有环境。在介绍 Kubernetes 的安装之前,我觉得有必要先对 Kubernetes 的结构做一个简单的介绍,这样对于安装过程可能就会比较少疑问。
首先在 Kubernetes 的集群结构上,节点被分为两种类型,分别是 Master 和 Node 类型,其中 Master 节点又称为控制节点,用于管理集群,主要任务有:
- 对外提供 API 访问接入点(apiserver)
- 容器编排(controller-manager)
- 容器调度(scheduler)
而 Node 节点主要负责容器的管理,用于运行容器和保证容器的状态。默认情况下,Master 节点不承担 Node 节点的功能,但是可以通过特殊的配置让 Master 节点也可以作为 Node 节点。
除了这些提到的组件之外,还有一个额外的组件 Etcd,它用于存储 Kubernetes 的元数据,但是不要求一定要以容器的形式运行,如果你想,可以直接以进程的形式运行起来,但是,后面我为了方便期间,还是以容器的方式运行。这些差不多就是我觉得安装 Kubernetes 前需要了解的前置知识了,下面我就开始介绍一下我是如何安装 Kubernetes 的。
安装前提
可能网络上有很多在墙内安装 Kubernetes 的教程了,但是,很遗憾,我这篇内容里面忽略了墙的因素,也就是说我这里假设你的服务器是在墙外的,或者可以无视墙,如果有墙的话,可能你需要做一些特别的设置来解决,这个我不在这篇文章讨论。
Master 和 Node 安装必要的软件
[root@liqiang.io]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
[root@liqiang.io]# swapoff -a
[root@liqiang.io]$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@liqiang.io]$ yum install docker-ce
[root@liqiang.io]# systemctl start docker
[root@liqiang.io]# systemctl enable docker
# Set SELinux in permissive mode (effectively disabling it)
[root@liqiang.io]# setenforce 0
[root@liqiang.io]# systemctl stop firewalld
[root@liqiang.io]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@liqiang.io]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@liqiang.io]# systemctl enable --now kubelet
修改节点 hostname
[root@liqiang.io]# hostname node-master
[root@liqiang.io]# echo "node-master" > /etc/hostname
[root@liqiang.io]# hostname node-slave01
[root@liqiang.io]# echo "node-slave01" > /etc/hostname
[root@liqiang.io]# hostname node-slave02
[root@liqiang.io]# echo "node-slave02" > /etc/hostname
Master 节点初始化
[root@liqiang.io]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.27.226
[root@liqiang.io]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这里可以根据你的环境需要将 192.168.27.226 换成你的机器 IP,或者删掉这一项也可以。当这些命令都运行完毕之后,你的 Kubernetes 集群应该是初步安装完毕了,接下来要将集群中的节点都加入到 Master 的管控之中,从而成为一个真正的整体。在 kubeadm init
的输出结果中,应该会有类似这样的提示:
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.27.226:6443 --token supersupersupersecret \
--discovery-token-ca-cert-hash sha256:alonglonglongtokenhere
将最后一段拷贝下来,然后在每个 Node 节点都执行一遍,接着就直接在 Master 节点上等待集群配置完成吧,稍等片刻之后,通过命令 kubectl get nodes
查看一下集群的节点状态:
[root@liqiang.io]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
lq-master Ready master 7h v1.14.1
lq-slave01 Ready worker 6h v1.14.1
lq-slave02 Ready worker 6h v1.14.1
你应该可以看到类似的结果。如果你看到的结果和这不太一样,可以对照我之前写过的一篇:部署 kubernetes 遇到的坑 看一下是否可以自行定位出问题的结果。
基础概念
这里转载一张别人的图,我觉得画得很不错,所以就转在这里了,原作在最后得 Reference 中有链接,有兴趣可以点开查看一下,谢谢。
其他支持
Yum 设置代理
[root@liqiang.io]# tailf -10 /etc/yum.conf
proxy=http://192.168.1.1:8118
proxy_username=username
proxy_password=password
重新初始化
[root@liqiang.io]# kubeadm reset