当前位置: 首页 > news >正文

Centos7.9使用kubeadm部署K8S单机环境

Centos7.9使用kubeadm部署K8S单机环境

使用kubeadm部署一个k8s单机环境

1. 环境信息

  • 操作系统:CentOS 7.9.2009
  • 内存: 4GB
  • CPU: 2
  • 网络: 能够互访,能够访问互联网
hostnameip备注
k8s192.168.0.159master + worker

2. 准备工作

在所有节点(包括 Master 和 Worker 节点)上执行以下步骤。

2.1 linux基础配置

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld# 关闭 swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab# 关闭 selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config# 设置时区
timedatectl set-timezone Asia/Shanghai# 时间同步
yum -y install ntpdate
ntpdate time.windows.com
hwclock --systohc# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

2.2 安装 Docker

# 添加镜像源
curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# 查看docker-ce的版本列表
yum list docker-ce --showduplicates | sort -r
# 安装20.10
yum -y install docker-ce-20.10.6-3.el7
systemctl start docker
systemctl enable docker# 换成阿里Docker仓库
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://wnsrsn9i.mirror.aliyuncs.com"]
}
EOF# 重启配置生效
systemctl restart docker
docker info
...Registry Mirrors:https://wnsrsn9i.mirror.aliyuncs.com/
...

2.3 安装 kubeadm、kubelet 和 kubectl

# 添加镜像源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF# 查看支持的版本
yum list kubelet --showduplicates | sort -r# 安装
yum install -y kubelet-1.22.0 kubeadm-1.22.0 kubectl-1.22.0# 配置kubelet服务自启动
systemctl enable kubelet

3. 单机部署

# 设置hostname
hostnamectl set-hostname k8s
cat >> /etc/hosts << EOF
192.168.0.159 k8s
EOF# 初始化 Master
kubeadm init \
--apiserver-advertise-address=192.168.0.159 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16...
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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.0.159:6443 --token vb5md9.x6xwf6v3cr41iwio \--discovery-token-ca-cert-hash sha256:acb09147ed61103c7ab66d16150a382b378e10bb76cf986556830483c58ce448
...# 按照提示执行如下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果是root用户,也可执行如下命令
export KUBECONFIG=/etc/kubernetes/admin.conf# 去除污点
kubectl describe node k8s | grep Taints
kubectl taint nodes k8s node-role.kubernetes.io/master-# 部署CNI网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 查看运行状态
kubectl get pods -A

如果kubeadm部署没有成功需要重新部署,请执行kubeadm reset重置后重试。

问题记录:

  1. kubelet服务无法正常运行,报错如下:
"Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
kubelet.service: main process exited, code=exited, status=1/FAILURE

解决方式:

在daemon.json中增加如下配置,"exec-opts": ["native.cgroupdriver=systemd"],,重启docker服务生效。然后重新启动kubelet服务即可恢复正常。

cat /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://wnsrsn9i.mirror.aliyuncs.com"]
}
  1. 国内网络无法下载安装flannel

如果无法下载yml文件,手动创建kube-flannel.yml,内容如下:

---
kind: Namespace
apiVersion: v1
metadata:name: kube-flannellabels:k8s-app: flannelpod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-flannellabels:tier: nodek8s-app: flannelapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","EnableNFTables": false,"Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-flannellabels:tier: nodeapp: flannelk8s-app: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: docker.io/flannel/flannel-cni-plugin:v1.4.1-flannel1command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: docker.io/flannel/flannel:v0.25.4command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: docker.io/flannel/flannel:v0.25.4command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate

部署flannel会拉取两个镜像,国内网络环境有时候无法顺利拉取,可以从其他地方获取后离线导入当前环境:

[root@k8s-master ~]# docker images
REPOSITORY                                                        TAG               IMAGE ID       CREATED        SIZE
flannel/flannel                                                   v0.25.4           e6c43605b714   18 hours ago   81MB
flannel/flannel-cni-plugin                                        v1.4.1-flannel1   1e3c860c213d   7 weeks ago    10.3MB

4. 创建测试应用

# 创建一个nginx应用,并暴露到节点外部
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort# 查看部署的应用
kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-ldnxj   1/1     Running   0          21sNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        8m32s
service/nginx        NodePort    10.109.172.88   <none>        80:32409/TCP   16s

通过k8s节点ip+32409端口即可访问nginx。

相关文章:

  • 模式识别与机器学习复习题解析(2023春)
  • 基于C#开发web网页管理系统模板流程-参数传递
  • vue3+ Element-Plus 点击勾选框往input中动态添加多个tag
  • FreeRTOS队列(queue)
  • 零基础开始学习鸿蒙开发-@State的使用以及定义
  • Windows电脑清理C盘内存空间
  • 样式的双向绑定的2种方式,实现样式交互效果
  • Proteus 新建工程
  • 蓝桥杯十五届国赛模拟题8
  • 【百度智能体】零代码创建职场高情商话术助手智能体
  • HTML中的<br>、<hr>和<pre>标签使用指南
  • 大数据与人工智能在保险行业数字化转型中的应用
  • 代码随想录-Day31
  • FreeRTOS简单内核实现5 阻塞延时
  • nginx全解
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • chrome扩展demo1-小时钟
  • Create React App 使用
  • Js基础——数据类型之Null和Undefined
  • Laravel Telescope:优雅的应用调试工具
  • PHP CLI应用的调试原理
  • Redis中的lru算法实现
  • SegmentFault 2015 Top Rank
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于游标的分页接口实现
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端之React实战:创建跨平台的项目架构
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 数据可视化之 Sankey 桑基图的实现
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​VRRP 虚拟路由冗余协议(华为)
  • #stm32整理(一)flash读写
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)Nginx简介和安装教程
  • (C++20) consteval立即函数
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Oracle)SQL优化技巧(一):分页查询
  • (pojstep1.1.2)2654(直叙式模拟)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (力扣)循环队列的实现与详解(C语言)
  • (三)c52学习之旅-点亮LED灯
  • (三)模仿学习-Action数据的模仿
  • (四)事件系统
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)jQuery 基础
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ../depcomp: line 571: exec: g++: not found
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost