搭建Kubernetes(k8s)集群(cka考试环境)
搭建Kubernetes(k8s)集群
- 基础介绍
- containerd简介
- Docker vs containerd
- K8S为什么要放弃使用Docker作为容器运行时,而使用containerd呢?
- 环境准备
- 安装 Containerd
- 配置 containerd
- 安装 kubeadm kubelet kubectl
- 安装flannel网络插件,采用离线安装
本文章针对cka考试,目的为使用containerd和kubeadm搭建cka考试环境。
需要kubernetes官方文档作参考。
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
如果你不指定运行时,则 kubeadm 会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的 Unix 域套接字。
如果同时检测到 Docker 和 containerd,则优先选择 Docker。 这是必然的,因为 Docker 18.09 附带了 containerd 并且两者都是可以检测到的, 即使你仅安装了 Docker。 如果检测到其他两个或多个运行时,kubeadm 输出错误信息并退出。 kubelet 通过内置的 dockershim CRI 实现与 Docker 集成。
基础介绍
containerd简介
containerd是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。containerd可以在宿主机中管理完整的容器生命周期,包括容器镜像的传输和存储、容器的执行和管理、存储和网络等。
Docker vs containerd
containerd是从Docker中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了Kubernete容器运行时更好的选择。
K8S为什么要放弃使用Docker作为容器运行时,而使用containerd呢?
如果你使用Docker作为K8S容器运行时的话,kubelet需要先要通过 dockershim 去调用Docker,再通过Docker去调用containerd。
如果你使用containerd作为K8S容器运行时的话,由于containerd内置了 CRI (Container Runtime Interface:容器运行时接口)插件,kubelet可以直接调用containerd。
环境准备
- 三台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存), 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址。
- 开启机器上的某些端口。
- 禁用交换分区。为了保证 kubelet 正常工作,必须 禁用交换分区。
- 虚拟机联网!
禁用交换分区
kubelet 在 1.8 版本以后强制要求 swap 必须关闭。要不然kubelet 无法正常启动
[root@master yum.repos.d]# swapoff -a
[root@master yum.repos.d]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
关闭 SELinux
将 SELinux 设置为 disabled模式
临时关闭
sudo setenforce 0
永久禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
安装 Containerd
安装和配置的先决条件:
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOFsudo modprobe overlay
sudo modprobe br_netfilter
设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF# 应用 sysctl 参数而无需重新启动
sudo sysctl --system
安装 containerd:
从官方Docker仓库安装 containerd.io 软件包。可以在 安装 Docker 引擎 中找到有关为各自的 Linux发行版设置 Docker 存储库和安装 containerd.io 软件包的说明。
使用阿里云yum源
[root@master yum.repos.d]# vim docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
enabled=1
[root@master yum.repos.d]# yum install -y containerd.io
发现有报错!
Error: Package: containerd.io-1.6.4-3.1.el7.x86_64 (docker-ce)Requires: container-selinux >= 2:2.74You could try using --skip-broken to work around the problemYou could try running: rpm -Va --nofiles --nodigest
原因是因为用的rhel7.3的操作系统。centos则不需要。
[root@master yum.repos.d]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
rhel7.3版本较低,后来使用了阿里云的centos的扩展yum源发现安装还是有依赖性,报错版本低。
因此直接使用centos的yum源。
[root@master ~]# cat /etc/yum.repos.d/
centos.repo docker-ce.repo redhat.repo
[root@master ~]# cat /etc/yum.repos.d/centos.repo
[rhrl7.3]
name=rhel7.3
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
gpgcheck=0
enabled=1
[root@master ~]# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
[centos]
name=centos
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
gpgcheck=0
containerd.io安装成功!
配置 containerd
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml
修改配置文件
[root@master ~]# cd /etc/containerd/
[root@master containerd]# ls
config.toml
[root@master containerd]# vim config.toml
在文件 config.toml 中找到该行并修改镜像源。
sandbox_image = “k8s.gcr.io/pause:3.6”
默认使用的镜像是k8s的,不科学上网连不上,改为国内阿里云镜像仓库。否则建立k8s集群时会报错。
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
注意这条 systemd_cgroup = false 不能改为true,否则后面在node节点kubeadm
join时会报错,具体报错为:[root@node1 lib]# tail /var/log/messages Jun 11 21:37:11 localhost
kubelet: E0611 21:37:11.711773 8321 server.go:205] “Failed to load
kubelet config file” err=“failed to load Kubelet config file
/var/lib/kubelet/config.yaml, error failed to read kubelet config file
“/var/lib/kubelet/config.yaml”, error: open
/var/lib/kubelet/config.yaml: no such file or directory”
path=“/var/lib/kubelet/config.yaml” Jun 11 21:37:11 localhost systemd:
kubelet.service: main process exited, code=exited, status=1/FAILURE
Jun 11 21:37:11 localhost systemd: Unit kubelet.service entered failed
state. Jun 11 21:37:11 localhost systemd: kubelet.service failed.没有/var/lib/kubelet/config.yaml这个文件。
使用 systemd cgroup 驱动程序
结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置,
SystemdCgroup改为true。
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true
如果您应用此更改,重新启动 containerd:
sudo systemctl restart containerd
安装 kubeadm kubelet kubectl
在所有机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
kubeadm 不能帮你安装或者管理 kubelet 或 kubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。
一定要指定版本,否则会安装最新版。
yum install -y kubeadm-1.23.1-0 kubelet-1.23.1-0 kubectl-1.23.1-0
设置开机自启并立即启动kubelet
systemctl enable --now kubelet
kubeadm初始化:
[root@master ~]# kubeadm config print init-defaults > kubeadm-init.yaml
[root@master ~]# vim kubeadm-init.yaml
修改以下地方
提示:低版本的操作系统注意升级systemd(yum upgrade systemd
),否则会报错。
[root@master ~]# kubeadm init --config kubeadm-init.yaml
初始化成功!
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 -u):(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.25.254.1:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256:14fbb510c5d836b637665f8bb451ce2de51d568ae2a574becf932998f2afe48f
[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
将kubeadm init 初始化完成后的这个命令写入到下面文件,使用环境变量。
vim .bash_profile export KUBECONFIG=/etc/kubernetes/admin.conf
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 26m v1.23.1
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-frkfl 0/1 Pending 0 26m
kube-system coredns-6d8c4cb4d-x85ct 0/1 Pending 0 26m
kube-system etcd-master 1/1 Running 0 26m
kube-system kube-apiserver-master 1/1 Running 0 26m
kube-system kube-controller-manager-master 1/1 Running 0 26m
kube-system kube-proxy-rt476 1/1 Running 0 26m
kube-system kube-scheduler-master 1/1 Running 0 26m
缺少网络组件。
安装flannel网络插件,采用离线安装
浏览器打开 https://kubernetes.io/docs/concepts/cluster-administration/addons/
找到flannel,
下载kube-flannel.yml
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
[root@master ~]# kubectl apply -f kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-jnk68 0/1 Pending 0 6h18m
kube-system coredns-6d8c4cb4d-wxmc7 0/1 Pending 0 6h18m
kube-system etcd-master 1/1 Running 2 6h18m
kube-system kube-apiserver-master 1/1 Running 2 6h18m
kube-system kube-controller-manager-master 1/1 Running 2 6h18m
kube-system kube-flannel-ds-jjr2q 0/1 Init:0/2 0 33s
kube-system kube-proxy-w9fsp 1/1 Running 0 6h18m
kube-system kube-scheduler-master 1/1 Running 2 6h18m
该行可看到正在下载网络组件,等待下载完毕后,coredns就绪了:
kube-system kube-flannel-ds-jjr2q 0/1 Init:0/2 0 33s
查看tocken,注意这个tocken是24小时的,过期需要重新创建:
[root@master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
abcdef.0123456789abcdef 17h 2022-06-12T06:47:01Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
将node节点加入到集群中
node节点执行:
kubeadm join 172.25.254.1:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:14fbb510c5d836b637665f8bb451ce2de51d568ae2a574becf932998f2afe48f --v=5
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 50m v1.23.1
node1 NotReady <none> 17m v1.23.1
node2 Ready <none> 49m v1.23.1
STATUS一直为NotReady,是因为kube-flannel还未拉取成功,
[root@master ~]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-mklgj 0/1 Init:1/2 0 2m33s 172.25.254.2 node1 <none> <none>
等待全部拉取完成后,所有节点也变为ready状态。
至此,k8s集群搭建完毕。
搭建Kubernetes(k8s)集群(cka考试环境)相关推荐
- Centos7 安装部署Kubernetes(k8s)集群过程
1.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.9 Docker version 20.10.12 x86_64 2.前言 如下图描述了软件部 ...
- 自己搭建的k8s集群,怎么做负载均衡?
如果把K8S搞在公有云上,可以跟云厂商买它的负载均衡服务,就用这个负载均衡服务提供的公网IP,把你的域名映射到这个公网IP上,然后配置这个云厂商提供的负载均衡服务,让它往后端的ECS主机上转发 但是呢 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...
- 直播 | 基于kubeadm搭建Kubernetes HA集群
分享时间:6月18日 20:30 分享主题:基于kubeadm搭建Kubernetes HA集群 分享人介绍: 张炯,上汽集团下属赛可出行运维工程师.10年工作经验,曾任职于Ctrip.SNDA,作为 ...
- 【云原生-K8s】kubeadm搭建安装k8s集群v1.25版本完整教程【docker、网络插件calico、中间层cri-docker】
前言 基础描述 从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能 ...
- 在sealos搭建的k8s集群中自定义kubeconfig文件
推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...
- kubeadm搭建的K8S集群升级
微信公众号:运维开发故事,作者: 乔克 升级说明 可用的K8S集群,使用kubeadm搭建 可以小版本升级,也可以跨一个大版本升级,不建议跨两个大版本升级 对集群资源做好备份 升级目标 将kubern ...
- Kubernetes(k8s)集群安装(需要3台centos7)
k8s安装的命令 1:关闭防火墙,关闭selinux 2:修改主机名 3:修改hosts文件 4:禁用swap内存交换 5:安装docker 6:上传k8s.repo 7:初始化集群 8:初始化k8s ...
- 单机快速体验k8s集群的测试环境
快速指南 以下为快速体验k8s集群的测试.开发环境–单节点部署(aio),国内环境下比官方的minikube方便.简单很多. 1.基础系统配置 准备一台虚机配置内存2G/硬盘30G以上 最小化安装Ub ...
- Kubernetes(k8s)集群部署七、k8s网络通信+service扩展ingress(TLS,认证,地址重写)calico网络插件(允许指定pod访问服务,禁止其他namespace访问服务)
k8s网络通信 k8s网络通信 1.容器间通信 2.pod之间的通信 2.1同一节点的pod 2.2不同节点的pod之间的通信 flannel网络原理 flannel支持多种后端: 3.pod和ser ...
最新文章
- oss对象存储服务操作
- 暗夜ト星ノ冥土馆~ぷにゅぷりXX 汉化补丁
- python能处理图片吗_python图片处理(一)
- #define宏定义中的#,##,@#,\ 这些符号的神奇用法
- 胃癌2019csco指南_领读指南沈琳:2019CSCO胃癌指南重要更新
- 2639-Bone Collector II (01背包之第k优解)
- Flink系列-实时数仓之Flink实时写入ClickHouse并实时大屏Tableau
- mysql 定位字符串的位置
- 选择排序的Java代码实现(超详细代码)
- 实对称矩阵对角化为什么要做正交化单位化操作呢?
- 超过2t硬盘分区_超过2T和3T及以上硬盘的MBR与GPT分区形式
- 基于android物流快递服务系统app
- easyexcel实现导出
- 移动端flexible解决ipad和ipad Pro不适配
- SOA面向服务的架构设计
- android_usb_msd,MSD6A828安卓智能电视主板
- Coad和Yourdon面向对象的分析过程
- SQL数据库系统设计之食堂管理系统
- linux服务器加固
- 为什么互联网大厂一边疯狂裁员,一边不停招聘?
热门文章
- linux_bash/zsh ls(dircolor)_文件夹背景颜色去除(绿色背景)(fit to wsl)(simple solution)
- 指尖江湖李忘生鸿蒙初开,指尖江湖掌门天团年轻时外装来袭!其中,纯阳掌教李忘生的该系列外装名为?剑网3指尖江湖11.9答案_游侠手游...
- 陈平 教授的演讲(经济学家)
- 智能灯控制页面用HTML编写,3分钟教你创建手机APP控制全彩智能灯泡应用,图形化编程!...
- 大脑神经网络是如何形成的,大脑自组织神经网络
- 看看安卓开发者在APP推广路途中是如何被金山“恶霸”所“黑打”的!
- NO.15——使用Appium自动化测试爬取微信朋友圈数据
- iOS开发底层之KVO探索下 -18
- 五种以上linux的发行版本,Linux 各发行版本简介
- Mac微信怎么多开? 2招教会你