前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用kubeadm创建K8S单控制节点集群

使用kubeadm创建K8S单控制节点集群

作者头像
dhyuan
发布2022-05-30 14:20:57
6970
发布2022-05-30 14:20:57
举报
文章被收录于专栏:响应式编程

这里的场景是在一台KVM host上创建一个master guest host,三个nodes guest hosts,并组成kubernets集群。如图:

在对 K8S 控制节点有 HA 方面需求的话,应考虑 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/ 提到的两种拓扑。

HA 的方式除了让 controll nodes 和 etcd 有多个节点外,另外一个就是对外需要 VIP + LoadBalance 的功能。https://github.com/kubernetes/kubeadm/blob/master/docs/ha-considerations.md#options-for-software-load-balancing 讲述了如果使用 keepalived 和 haproxy 来实现这个前提。这个连接讲述了三个部署 keepalive, haproxy 的方式。推荐还是使用第二或第三种,第一种方式仅作为我们理解背后工作的逻辑就好。

因为这里只是开发环境使用的 k8s,所以就不以 HA 的方式安装 k8s 了。。无非就是多了两个步骤: (1)准备 VIP/LB;

(2)kubeadm --init 时,用--control-plane flag 添加其它 CP 节点而已)。

开始安装:

1)为 kubeadm 准备虚拟机和 docker

准备开发用 KVM HOST 并 创建网桥

步骤参考: a) 准备 kvm:https://dhyuan.github.io/2020/09/19/devops/create_gust_hosts_on_kvm_by_ansible/ b) 创建网桥:https://dhyuan.github.io/2020/09/21/devops/create_bridge_on_centos7/

下载创建虚拟机的 CentOS7 镜像

代码语言:javascript
复制
curl -O https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

sudo mv -iv CentOS-7-x86_64-GenericCloud.qcow2 /var/lib/libvirt/images/

获取一键安装 GuestHost 和 Docker 的 ansible 脚本。

注意这里是使用分支 devenv 上的代码。

代码语言:javascript
复制
cd ~/devenv_bootstrap
git clone -b devenv https://github.com/dhyuan/virt-infra-ansible.git

cd ~/devenv_bootstrap/virt-infra-ansible/roles
git clone -b devenv https://github.com/dhyuan/ansible-role-virt-infra

ansible-galaxy install \
--roles-path ~/.ansible/roles/ \
git+https://github.com/haxorof/ansible-role-docker-ce.git,2.7.0

根据自己的需求修改 K8S master、nodes 节点的主机配置。

注意:节点名称已经改为使用-而不是_以符合 DNS 规范。这点是 K8S 的要求,但是和 yaml 的格式规范使用下划线有儿冲突。

代码语言:javascript
复制
cd ~/devenv_bootstrap
vi inventory/k8s-masters.yml
vi inventory/k8s-nodes.yml

一键创建 master + nodes 虚拟机

代码语言:javascript
复制
ansible-playbook ./virt-infra.yml \
    --limit kvmhost,k8s-masters,k8s-nodes

一键在 master、nodes 节点上安装 docker

代码语言:javascript
复制
ansible-playbook ./install_docker.yml \
--limit k8s-masters,k8s-nodes -v \
-e '{"docker_repository_url": {"CentOS": "http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo"}}'

验证环境

在 KVM HOST 查看/etc/hosts 里面记录了各个主机节点 IP。 各节点互相 ping 登录到各主机检查 docker 引擎是否工作正常。

2)安装 kubeadm,此步骤需要在各个 master、nodes 节点执行。

下面基本参照官网 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ 以及另阿良的 https://mp.weixin.qq.com/s/8JznAEKe6b-wE-kNx7_Svg 来进行。

设置 kubernets yum 源

代码语言:javascript
复制
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
# 使用阿里源
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

enabled=1
gpgcheck=0
repo_gpgcheck=0
exclude=kubelet kubeadm kubectl
EOF

确保将桥接的 IPv4 流量传递到 iptables 的链:

加载 br_netfilter 模块加载:

代码语言:javascript
复制
sudo modprobe br_netfilter
lsmod | grep br_netfilter

设置 br_netfilter,也可设置在/etc/sysctl.d/99-sysctl.conf 文件里。

代码语言:javascript
复制
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF

sudo sysctl --system

设置禁用 SELinux

代码语言:javascript
复制
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

让各机器时间同步

因为这里的环境是运行在 KVM 里的虚拟机,所以这一步可忽略。在生成环境中,各机器时间应该同步。

代码语言:javascript
复制
yum install ntpdate -y
ntpdate time.windows.com

安装 kubeadm

代码语言:javascript
复制
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
yum list installed | grep kube

此时可用的最新版本是 1.19.2。

enable kubelet

代码语言:javascript
复制
sudo systemctl enable kubelet
sudo systemctl status kubelet

此时 kubelet 的状态是 failed,因为 api server 还没有起来。

3)构建集群

在规划的 master 节点上首先初始化一个集群的 master 节点

这里要注意因为 gcr.io 被墙, 所以是使用 ali 镜像。各参数含义参考:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/ 另外,关于 pod-network-cidr 的意义这篇文章非常好:https://blog.csdn.net/shida_csdn/article/details/104334372 执行 kubeadm 时需要下载镜像,所以需要稍等一会儿。

代码语言:javascript
复制
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

kubeadm init 命令输出大致如下,并且 kubelet 服务也已经正常。

代码语言:javascript
复制
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[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.1.11:6443 --token 67y1i4.686gqk1w73isp3op \
    --discovery-token-ca-cert-hash sha256:ccecf99d92615da1c67878029d79ae7323daac45476168091281ac80ddf0571d
[devops@k8s-master-0 ~]$

执行以下命令,让普通用户也能执行 kubectl 命令:

代码语言:javascript
复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件 flannel

代码语言:javascript
复制
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 替换 quay.io 为国内镜像 quay.mirrors.ustc.edu.cn

kubectl apply -f kube-flannel.yml

# 验证网络插件安装成功
kubectl get pods -n kube-system

如果需要,可以删除刚才安装的 flannel 插件:

代码语言:javascript
复制
kubectl delete -f kube-flannel.yml
ip link
ip link delete cni0
ip link delete flannel.1

把 nodes 加入集群

在各个 node 节点运行以下命令:

代码语言:javascript
复制
sudo kubeadm join 192.168.1.11:6443 --token 67y1i4.686gqk1w73isp3op \
        --discovery-token-ca-cert-hash sha256:ccecf99d92615da1c67878029d79ae7323daac45476168091281ac80ddf0571d

在 master 节点,验证 nodes 都成功加入 K8S 集群:

代码语言:javascript
复制
[devops@k8s-master-0 ~]$ kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master-0   Ready    master   72m     v1.19.2
k8s-node-0     Ready    <none>   4m41s   v1.19.2
k8s-node-1     Ready    <none>   76s     v1.19.2
k8s-node-2     Ready    <none>   89s     v1.19.2
[devops@k8s-master-0 ~]$

至此,已经完成了 Kubernetes 集群的搭建。

Reference:

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm https://mp.weixin.qq.com/s/8JznAEKe6b-wE-kNx7_Svg https://my.oschina.net/u/3021599/blog/4308021 https://cloud.tencent.com/developer/article/1525487 https://galaxy.ansible.com/geerlingguy/docker https://galaxy.ansible.com/ 在 CentOS7 上运行个 DHCP Server:https://www.tecmint.com/install-dhcp-server-in-centos-rhel-fedora/ https://www.cnblogs.com/hellxz/p/11044012.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1)为 kubeadm 准备虚拟机和 docker
    • 准备开发用 KVM HOST 并 创建网桥
      • 下载创建虚拟机的 CentOS7 镜像
        • 获取一键安装 GuestHost 和 Docker 的 ansible 脚本。
          • 根据自己的需求修改 K8S master、nodes 节点的主机配置。
            • 一键创建 master + nodes 虚拟机
              • 一键在 master、nodes 节点上安装 docker
                • 验证环境
                • 2)安装 kubeadm,此步骤需要在各个 master、nodes 节点执行。
                  • 设置 kubernets yum 源
                    • 确保将桥接的 IPv4 流量传递到 iptables 的链:
                      • 设置禁用 SELinux
                        • 让各机器时间同步
                          • 安装 kubeadm
                            • enable kubelet
                            • 3)构建集群
                              • 在规划的 master 节点上首先初始化一个集群的 master 节点
                                • 安装网络插件 flannel
                                  • 把 nodes 加入集群
                                    • 在 master 节点,验证 nodes 都成功加入 K8S 集群:
                                    相关产品与服务
                                    容器镜像服务
                                    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档