K8S 的安装与配置
K8S 在当年因为其复杂、艰难的安装方式被称为是新人杀手,劝退圈的 NO.1。大量想要学习 K8S 的人 被挡在了安装手册这座大山前。不过好在经过多年的发展,好几款快速安装 K8S 的工具都已经成熟。 今天介绍的就是 kubeadm 这款 K8S 官方安装工具。
准备工作
为了演示安装过程,选择 Centos 8 来作为宿主机,为了安装必要的工具, 需要添加阿里源。
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/
Centos-8.repo
复制代码
K8S 并不支持交换分区, 所以要关闭它。
为了让 Docker 网络生效,需要让宿主机拥有类似路由器一样的网络转发功能。 这样在使用端口映射的 方式启动容器的时候,才能使用宿主机作为跳板间接的与容器网络进行通信。 靠的就是将发往宿主机特 定的网络请求转发给容器网络实现的,具体的原理这里不深入讨论了。 但是为了让宿主机有这样的能力 需要打开两个内核参数。
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
复制代码
安装 DOCKER
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/
docker-ce.repo
yum -y install docker-ce
复制代码
安装 KUBECTL、KUBELET、KUBEADM
安装前先介绍一下这三个工具。
kubeadm:之前说过这个是 k8s 集群的安装工具
kubectl:k8s 的命令行工具,后续都使用使用这个命令与 k8s 通信
kubelet:可以理解为 k8s 在每个节点上启动的 agent,它负责维护当前节点的状态和节点上启动的 所有容器的维护工作。 由于它不能够被容器化部署,所以必须手动下载。PS:其他 k8s 的服务可 以容器化部署所以不需要手动下载。
首先添加阿里源
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
复制代码
安装
yum install kubectl kubelet kubeadm
systemctl enable kubelet
复制代码
这个命令需要注意以下两点:
因为谷歌的镜像在国内是无法下载的,所以需要通过--image-repository 参数来指定从阿里云上下载 所需要的镜像 命令默认会安装最新的 k8s 版本, 如果想要指定版本可以通过--kubernetes-version 参数来完成这 个目的 当命令运行成功后,会打印出如下的信息:
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 172.17.56.102:6443 --token m2ecof.03b44fgi1afkwmrb \
--discovery-token-ca-cert-hash
sha256:a24e63796be4510c3181daf9923117b33a7f64f7ba662018af941cc8751aebd6
复制代码
如果看到上面的信息那证明集群已经安装成功。并且上面的信息非常有用,需要按信息内容严格执行才 能顺利使用集群。这里针对这段信息需要注意的有如下 2 点:
需要按照信息所提示的将 kubeconfig 文件复制到 $HOME/.kube/config 路径下并赋予相应的权限。 kubectl 命令会在此目录下寻找 kubeconfig 文件并与 K8S 的 apiserver 进行通信。 kubeconfig 文 件中包含 K8S apiserver 的地址和数字证书等信息,是大多数外部程序跟 K8S 通信的必需品。 如 果你希望通过 K8S 开源出来的客户端与 K8S 进行通信,那不管使用哪种语言的客户端第一步都要 指定 kubeconfig 的路径对客户端进行初始化。
目前搭建的 K8S 集群是单节点集群,如果希望将其他节点加入到集群中来,需要按上述信息提示 的在对应节点使用 kubeadm join 命令。 所以要保存好上述信息的这段命令。
截止到这里还无法使用 K8S 集群,当使用 kubectl get pods -n kube-system 这个命令来查看会 发现 K8S 的 DNS 仍然不是运行状态。
kubectl get pods -n kube-system
NAME READY STATUS
RESTARTS AGE
coredns-7f89b7bc75-ddrbd 0/1 ContainerCreating 0
11m
coredns-7f89b7bc75-pkv5w 0/1 ContainerCreating 0
11m
etcd-k8s.ceshiren.com 1/1 Running 0
11m
kube-apiserver-k8s.ceshiren.com 1/1 Running 0
11m
kube-controller-manager-k8s.ceshiren.com 1/1 Running 0
11m
kube-proxy-swchx 1/1 Running 0
11m
kube-scheduler-k8s.ceshiren.com 1/1 Running 0
11m
复制代码
这是因为没有安装 K8S 网络的 CNI 插件, K8S 支持很多种插件式的设计, 其网络也是其中之一。 它不会预先帮助用户安装网络组件,而是把这个权力留给用户。 目前主流的网络组件有 flannel,calico 和 weave。本次使用 calico 来进行安装。
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码
如果安装成功,就可以用 kubectl get pods -n kube-system 命令看到 dns 和 calico 相关的 POD 都已经是运行状态了。
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-69496d8b75-mpd8h 1/1 Running 0 45s
calico-node-59xrp 1/1 Running 0 45s
coredns-7f89b7bc75-ddrbd 1/1 Running 0 14m
coredns-7f89b7bc75-pkv5w 1/1 Running 0 14m
etcd-k8s.ceshiren.com 1/1 Running 0 14m
kube-apiserver-k8s.ceshiren.com 1/1 Running 0 14m
kube-controller-manager-k8s.ceshiren.com 1/1 Running 0 14m
kube-proxy-swchx 1/1 Running 0 14m
kube-scheduler-k8s.ceshiren.com 1/1 Running 0 14m
复制代码
当然现在集群仍然不是可用状态, 如果这个时候向 K8S 提交一个 POD 会发现 POD 会一直处于 pending 状态, 这是因为使用 kubeadm 安装的 K8S 集群它都会默认为主节点打上一个污点(taint)。 污点是 K8S 中的一个调度策略。 可以把它当做一个标识, 凡是被打上污点的节点默认情况下是不可以使用的, 只有在创建 POD 的时候显示的声明可以容忍(tolerate)这个污点才可以被调度到这个节点 上。 kubeadm 之所以给 Master 节点打上一个污点是从保护主节点出发考虑的。试想一下主节点上运行 的都是 K8S 的关键服务,一但这些服务出现问题那么会导致整个 K8S 集群瘫痪,所以如果准许普通的 POD 也调度到 Master 节点的话,那么大量的任务可能会存在压垮主节点的风险。 所以为了保护这些服 务,kubeadm 会默认给 Master 节点打上污点以保证普通的 POD 不会调度到 Master 节点上。 那么为 了在本次演示中能够使用主节点, 可以采取手动的删除这个污点。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s.ceshiren.com Ready control-plane,master 58m v1.20.4
kubectl taint nodes k8s.ceshiren.com node-role.kubernetes.io/master:NoSchedule
复制代码
注意删除污点的命令格式为: kubectl taint nodes 节点名称 http://node-role.kubernetes.io/ master:NoSchedule- 所以才需要先使用 kubectl get nodes 命令去获取 Master 节点的名称。 至此 K8S 集群就已经搭建完毕了。
搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核
评论