用 kubeadm 搭建 kubernetes 集群

kubeadm

Kubedm 是一个 K8s 部署工具,提供 kubedm init 和 kebuadm join 用于快速部署 Kubernetes 集群。 Kubernetes集群的部署可以通过两条指令完成:

1.使用kubedm init创建一个Master节点

2.使用kubeadm join<master Node IP and port>将Node加入当前集群

终极目标

1.在所有节点上安装Docker、kubedm、kubelet和kubectl

  1. 部署 Kubernetes Master

3、部署容器网络插件

  1. 部署Kubernetes Node并将节点加入Kubernetes集群

5、部署Dashboard Web页面,可视化查看Kubernetes资源

环境准备

角色

知识产权

k8s-master

192.168.1.16

k8s-node1

192.168.1.30

作为居民

192.168.1.31

安装

系统初始化

关闭防火墙

systemctl 停止防火墙

systemctl 禁用防火墙

关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

关闭交换

# 暂时关闭

交换-a

永久关闭,下次生效

sed -ri 's/.*swap.*/#&/' /etc/fstab

主机名

hostnamectl 设置主机名 <主机名>

在master中添加主机

猫 >> /etc/hosts << EOF

192.168.1.16 k8s-master

192.168.1.30 k8s-node1

192.168.1.31 饰演 Kassendi

EOF

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

猫 > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables u003d 1

net.bridge.bridge-nf-call-iptables u003d 1

EOF

生效

sysctl --系统

时间同步

百胜安装 ntpdate -y

ntpdate time.windows.com

在所有节点上安装docker/kubedm/kubelet/kubectl

安装docker

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y 安装 docker-ce-18.06.1.ce-3.e17

systemctl 启用 docker && systemctl 启动 docker

码头工人--版本

添加阿里云YUM软件源

设置仓库地址

猫 > /etc/docker/daemon.json << EOF

{

“注册表-镜像”:[“https://b9pmyelo.mirror.aliyuncs.com”]

}

EOF

更新/etc/yum.com repos。 d/kubernetes。回购添加百胜源

[kubernetes]

名称u003dKubernetes

baseurlu003dhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

启用u003d1

gpgchecku003d0

回购_gpgchecku003d0

gpgkeyu003dhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安装kubedm、kubelet、kubectl

yum install -y kubelet kubdum kubectl

systemctl 启用 kubelet

部署 Kubernetes Master

kubeadm 初始化 \

--apiserver-advertise-addressu003d192.168.1.16 \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version v1.23.1 \

--service-cidru003d10.96.0.0/12 \

--pod-network-cidru003d10.244.0.0/16

参数说明:

--kubernetes-version v1.23.1 指定版本

– apiserver 通告地址是指通告给其他组件的 IP。一般应该是主节点的IP地址

– service CIDR 指定服务网络,不能与节点网络冲突

– pod network CIDR 指定pod网络,不能与node网络和服务网络冲突

--image-repository registry.aliyuncs.com/google_containers 指定镜像源,因为默认镜像地址是k8s gcr。 IO在中国无法访问。这里指定阿里云镜像仓库的地址。

如果k8s版本比较新,阿里云可能没有对应的镜像,需要从其他地方获取镜像。

配置kubectl

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看节点信息

kubectl 获取节点

配置法兰绒

创建个人资料:

vim kube-flannel.yml

---

api版本:策略/v1beta1

种类:PodSecurityPolicy

元数据:

名称:psp.flannel.unprivileged

注释:

seccomp.security.alpha.kubernetes.io/allowedProfileNames:docker/default

seccomp.security.alpha.kubernetes.io/defaultProfileName:docker/default

apparmor.security.beta.kubernetes.io/allowedProfileNames:运行时/默认

apparmor.security.beta.kubernetes.io/defaultProfileName:运行时/默认

规格:

特权:假

卷:

  • 配置映射
  • 秘密
  • 空目录
  • 主机路径

允许的主机路径:

  • 路径前缀:“/etc/cni/net.d”
  • 路径前缀:“/etc/kube-flannel”
  • pathPrefix: "/run/flannel"

只读根文件系统:假

用户和组

运行用户:

规则:RunAsAny

补充组:

规则:RunAsAny

fs组:

规则:RunAsAny

权限提升

allowPrivilegeEscalation:假

defaultAllowPrivilegeEscalation: false

能力

allowedCapabilities:['NET_ADMIN','NET_RAW']

默认添加能力:[]

requiredDropCapabilities: []

主机命名空间

主机PID:假

主机IPC:假

主机网络:真

主机端口:

  • 分钟:0

最大值:65535

#SELinux

seLinux:

SELinux 在 CaaSP 中未使用

规则:'RunAsAny'


种类:ClusterRole

api版本:rbac.authorization.k8s.io/v1

元数据:

名称:法兰绒

规则:

  • apiGroups: ['extensions']

资源:['podsecuritypolicies']

动词:['使用']

资源名称:['psp.flannel.unprivileged']

  • api组:
  • “”

资源:

  • 豆荚

动词:

  • 得到
  • api组:
  • “”

资源:

  • 节点

动词:

  • 列表
  • 观看
  • api组:
  • “”

资源:

  • 节点/状态

动词:

  • 补丁

种类:ClusterRoleBinding

api版本:rbac.authorization.k8s.io/v1

元数据:

名称:法兰绒

角色参考:

apiGroup:rbac.authorization.k8s.io

种类:ClusterRole

名称:法兰绒

科目:

  • 种类:ServiceAccount

名称:法兰绒

命名空间:kube 系统


api版本:v1

种类:ServiceAccount

元数据:

名称:法兰绒

命名空间:kube 系统


种类:ConfigMap

api版本:v1

元数据:

名称:kube-flannel-cfg

命名空间:kube 系统

标签:

层:节点

应用:法兰绒

数据:

cni-conf.json:|

{

“名称”:“cbr0”,

"cniVersion": "0.3.1",

“插件”:\ [

{

“类型”:“法兰绒”,

“代表”:{

“发夹模式”:真,

“isDefaultGateway”:真

}

},

{

“类型”:“端口图”,

“能力”:{

“端口映射”:真

}

}

]

}

net-conf.json: |

{

“网络”:“10.245.0.0/16”,

“后台”:{

“类型”:“vxlan”

}

}


api版本:应用程序/v1

种类:DaemonSet

元数据:

名称:kube-flannel-ds

命名空间:kube 系统

标签:

层:节点

应用:法兰绒

规格:

选择器:

匹配标签:

应用:法兰绒

模板:

元数据:

标签:

层:节点

应用:法兰绒

规格:

亲和力:

节点亲和性:

requiredDuringSchedulingIgnoredDuringExecution:

节点选择器条款:

  • 匹配表达式:
  • 键:kubernetes.io/os

运算符:在

价值观:

  • linux

主机网络:真

priorityClassName:系统节点关键

耐受性:

  • 运算符:存在

效果:NoSchedule

serviceAccountName:法兰绒

初始化容器:

  • 名称:安装-cni

图片:quay.io/coreos/flannel:v0.14.0

命令:

  • cp

参数:

  • -f
  • /etc/kube-flannel/cni-conf.json
  • /etc/cni/net.d/10-flannel.conflist

体积安装:

  • 名称:cni

挂载路径:/etc/cni/net.d

  • 名称:法兰绒-cfg

挂载路径:/etc/kube-flannel/

容器:

  • 名称:kube-flannel

图片:quay.io/coreos/flannel:v0.14.0

命令:

  • /opt/bin/flanneld

参数:

  • --ip 表
  • --be-subnet-mgr

资源:

要求:

中央处理器:“100 米”

内存:“50Mi”

限制:

中央处理器:“100 米”

内存:“50Mi”

安全上下文:

特权:假

能力:

添加:[“NET_ADMIN”、“NET_RAW”]

环境:

  • 名称:POD_NAME

值来自:

字段参考:

fieldPath: metadata.name

  • 名称:POD_NAMESPACE

值来自:

字段参考:

字段路径:元数据.命名空间

体积安装:

  • 名称:运行

挂载路径:/run/flannel

  • 名称:法兰绒-cfg

挂载路径:/etc/kube-flannel/

卷:

  • 名称:运行

主机路径:

路径:/运行/法兰绒

  • 名称:cni

主机路径:

路径:/etc/cni/net.d

  • 名称:法兰绒-cfg

配置图:

名称:kube-flannel-cfg

执行yaml文件:

kubectl 应用 -f kube-flannel.yml

查看 flannel 部署结果:

kubectl -n kube-system 获取 pod -o 宽

! zoz100037](https://programming.vip/images/doc/58c414fad192cae54eb0106ef8691551.jpg)

查看节点状态:

kubectl 获取节点

部署Kubernetes节点

在 192.168.1.30 和 192.168.1.31 上向集群添加新节点,然后执行 kubedm init 的 kubedm join 命令输出:

kubeadm 加入 192.168.1.16:6443 --token smmkaf.f9mft92fmix6dwby \

--discovery-token-ca-cert-hash sha256:5ee2a223c8151b27efb73783b4df000aa23532964f77e86e2d25fb826748da28

测试Kubernetes集群

在 Kubernetes 中创建一个 Pod 并验证它是否正常工作:

kubectl 创建部署 nginx --imageu003dnginx

kubectl 暴露部署 nginx --port 80 --type NodePort

kubectl 获取 pod、svc

访问地址:http://NodeIP:Port

安装过程中出现的问题

升级系统内核

CentOS 7. 3.10.x 内置系统 X内核存在一些Bug,导致运行的Docker和Kubernetes不稳定。

CentOS 允许使用 ELRepo,这是一个可以将内核升级到最新版本的第三方存储库。

要在 CentOS 7 上启用 ELRepo 存储库,请运行:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

启用仓库后,您可以使用以下命令列出可用的内核相关包:

yum --disablerepou003d"*" --enablerepou003d"elrepo-kernel" 可用列表

安装最新的主线稳定内核:

yum --enablerepou003delrepo-kernel 安装 kernel-ml

最后重启机器并应用最新的内核,然后运行以下命令查看最新的内核版本:

curl: Peer 报告不兼容或不支持的协议版本

查找curl和NSS版本低的原因。解决方案是更新 NSS 和 curl。

yum 更新 nss 卷曲

初始化Kubernetes问题(配置文件已经存在)

kubeadm 重置

运行 Kubelet 失败:配置错误:kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd")

初始化失败,说明kubelet健康状态异常。

查看kubelet状态systemctl status kubelet并提示error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "system D" is different from docker cgroup driver: "cgroupfs"。

kubelet 的默认 cgroupdriver 是 cgroupfs,但它实际上推荐 systemd,有趣!

修改/etc/docker/daemon JSON中的docker,添加“exec opts”:[“native.cgroupdriveru003dsystemd”]

{

"注册表-镜像":["https://docker.mirrors.ustc.edu.cn"],

“exec-opts”:[“native.cgroupdriveru003dsystemd”]

}

修改立方体:

猫 > /var/lib/kubelet/config.yaml <<EOF

api版本:kubelet.config.k8s.io/v1beta1

种类:KubeletConfiguration

cgroupDriver:系统

EOF

重启 docker 和 kubelet:

systemctl 守护程序重新加载

systemctl 重新启动泊坞窗

systemctl 重启 kubelet

检查 docker info|grep "Cgroup Driver" 是否输出 Cgroup Driver: systemd:

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐