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

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

作者头像
dhyuan
发布于 2022-05-30 06:20:57
发布于 2022-05-30 06:20:57
75400
代码可运行
举报
文章被收录于专栏:响应式编程响应式编程
运行总次数:0
代码可运行

这里的场景是在一台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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
cd ~/devenv_bootstrap
vi inventory/k8s-masters.yml
vi inventory/k8s-nodes.yml

一键创建 master + nodes 虚拟机

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ansible-playbook ./virt-infra.yml \
    --limit kvmhost,k8s-masters,k8s-nodes

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
sudo modprobe br_netfilter
lsmod | grep br_netfilter

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

让各机器时间同步

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install ntpdate -y
ntpdate time.windows.com

安装 kubeadm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
yum list installed | grep kube

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

enable kubelet

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
[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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
kubectl delete -f kube-flannel.yml
ip link
ip link delete cni0
ip link delete flannel.1

把 nodes 加入集群

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo kubeadm join 192.168.1.11:6443 --token 67y1i4.686gqk1w73isp3op \
        --discovery-token-ca-cert-hash sha256:ccecf99d92615da1c67878029d79ae7323daac45476168091281ac80ddf0571d

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
Apollo quick start SampleApp demo Java
src/main/resources/META-INF/app.properties
oktokeep
2024/10/09
970
SpringCloud集成携程Apollo配置中心详解
昨天说到了基于SpringCloud Config来做配置中心和配置的自动更新【SpringCloud Config配置中心详解教程】,但是整体的使用起来,SpringCloud Config在配置管理,集群,环境管理上,还是有点不太方便;因此,这里再来一款更好用的配置中心框架:携程的apollo,他在环境、集群、机房等配置起来更加方便、更加灵活,而且SpringCloud整合Apollo实现配置中心、自动更新也非常简单;反而相比起来麻烦的到是Apollo的这个框架的环境搭建;因此这里就准备了2篇文章,本篇讲使用,另外一篇就是讲了基于Docker搭建Apollo的集群环境,可以配合一起看。
一行Java
2022/04/07
1K0
SpringCloud集成携程Apollo配置中心详解
spring boot整合apollo
由于apollo是提供配置管理的服务,即项目的配置需要统一存放在apollo上进行管理。对于单体项目来说需要与apollo进行通信并获取项目本身需要的配置信息。所以我们需要使用apollo提供的客户端apollo-client用于配置的获取和装配,以下详细介绍整合的过程步骤。
写一点笔记
2020/08/25
1K0
spring boot整合apollo
微服务之SpringCloud架构第六篇(下)——配置中心(Apollo)
Apollo客户端依赖于AppId,Apollo Meta Server等环境信息来工作,所以请确保下面的配置正确:
leehao
2025/02/11
1590
微服务之SpringCloud架构第六篇(下)——配置中心(Apollo)
SpringBoot整合Apollo看这篇文章基本够了
通过对比,可以看出,生产环境中 Apollo 相比 Spring Cloud Config 更具有优势一些。
黎明大大
2020/09/08
1.7K0
SpringBoot整合Apollo看这篇文章基本够了
Apollo(阿波罗)配置中心Java客户端使用指南使用指南
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
WindWant
2020/09/11
14.1K0
Apollo(阿波罗)配置中心Java客户端使用指南使用指南
快速学习-Apollo配置中心搭建
Apollo (阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
cwl_java
2020/07/16
3.3K0
Apollo配置中心使用篇
如果对配置中心完全没有过了解的,可以先移步去了解一下常用的开源配置中心组件,如: SpringCloud Config和Nacos等。
大忽悠爱学习
2023/04/18
9.9K0
Apollo配置中心使用篇
携程 Apollo 配置中心:Example
本文介绍如何基于 Spring Boot 来搭建 Apollo 客户端,并展示如何动态更改运行时服务的输出日志等级。参考阅读 Apollo · Java 客户端使用指南 以及 Apollo · 使用示例
happyJared
2019/03/20
1.6K0
携程 Apollo 配置中心:Example
快速学习-Apollo从入门到精通
Apollo (阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
cwl_java
2020/08/04
1.6K0
快速学习-Apollo从入门到精通
基础架构之分布式配置中心
随着项目的复杂度越来越高,微服务的盛行,各个中间件相互配合并发挥其优势,各种配置是避免不了的,以前尝试过配置放在文件,后来spring cloud 也推出了自己的spring cloud config 配置组件,功能上没有问题,但真正使用起来还是不顺手,顺势而为,携程开发部门开源了一套配置平台,官方介绍详见 https://github.com/ctripcorp/apollo,这篇文章主要介绍安装及Java、Net 项目使用。
低代码布道者
2022/07/29
3220
基础架构之分布式配置中心
Spring Boot 2.0 整合携程Apollo配置中心
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
JAVA葵花宝典
2019/06/19
9320
使用Apollo做配置中心
由于Apollo支持的图形化界面相对于我们更加的友好,所以此次我们使用Apollo来做配置中心
Java学习录
2019/04/18
1.5K0
使用Apollo做配置中心
Spring Boot接入配置中心Apollo
因为application.properties会发布到所有环境,所以apollo.meta最好是直接配置在环境变量中
十毛
2019/03/27
3.7K0
Spring Boot接入配置中心Apollo
spring/springboot的整合分布式配置中心(ACM diamond nacos Apollo)
代码下载:https://gitee.com/hong99/spring/issues/I1N1DF
逍遥壮士
2020/11/24
1.7K0
spring/springboot的整合分布式配置中心(ACM diamond nacos Apollo)
配置中心apollo使用
github https://github.com/apolloconfig/apollo/releases
翰墨飘香
2023/07/31
5160
分布式配置中心之Apollo实战
微服务架构下,服务的数量视项目的规模大小而定,但数量肯定最少有十几二十个,这些微服务有时候共用一些配置,修改一个配置,这诸多服务都要跟着一起改。任务繁多,而且容易出错。
行百里er
2021/07/14
1.6K0
分布式配置中心选型,为什么选择Apollo?
关于配置的常规方案是将配置信息抽离写入 xml、properties文件中,然后随着应用一块打包发布。如果有开发、测试、预发、生产等多套环境,则通过配置各自独立的文件以区分不同的环境。具备一定的扩展性,但每次配置参数变更都要重新发布应用,灵活性较差。
微观技术
2021/04/30
1.3K1
分布式配置中心选型,为什么选择Apollo?
Sentinel Client: 整合Apollo规则持久化
在前面的学习过程中,Sentinel 的规则,也就是我们之前定义的限流规则,是通过代码的方式定义好的。这是初始化时需要做的事情,Sentinel 提供了基于API的方式修改规则:
猿天地
2019/06/20
1.2K0
Sentinel Client: 整合Apollo规则持久化
apollo与springboot集成实现动态刷新配置
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
lyb-geek
2020/06/07
7.8K0
apollo与springboot集成实现动态刷新配置
相关推荐
Apollo quick start SampleApp demo Java
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验