Kubeadm部署一主两从的Kubernetes集群

Kubeadm部署一主两从的Kubernetes集群

作者:小怪兽ysl 2022-06-02 14:18:44

云计算

云原生 本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO 开源基础软件社区​​

​​https://ost.IDC.NET​​

kubernetes集群大体上分为两类:一主多从和多主多从。

一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。

多主多从:多台Master节点和多台Node节点,搭建麻烦,适合用于生产环境。

本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。

一、禁用swap分区

swapoff-a

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用。

启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭。

vim/etc/fstab

注释掉最后一行。

二、安装docker(三个节点)

1、切换镜像源

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

2、查看前镜像源中支持的docker版本

yumlistdocker-ce--showduplicates

3、安装指定版本docker(带上–setopt=obsoletes=0,使用指定版本)

yuminstall--setopt=obsoletes=0docker-ce-18.06.3.ce-3.el7-y

4、添加配置文件

Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs。

mkdir /etc/docker

cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

5、启动docker

systemctlrestartdocker
systemctlenabledocker

三、安装kubernetes组件(三个节点)

1、配置镜像源

vim/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyum.com/kubernetes/yum/doc/rpm-package-key.gpg

2、安装指定版本的kubeadm,kubelet和kubectl

yuminstall--setopt=obsoletes=0kubeadm-1.23.6-0kubelet-1.23.6-0kubectl-1.23.6-0-y

3、修改/etc/sysconfig/kubelet的内容,将里边内容替换

vim/etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

4、设置kubelet开机自启

systemctlenablekubelet

四、准备集群镜像

这步是为第五步的kubeadm init做准备,因为init会拉取镜像,而此镜像在kubernetes的仓库中,由于网络原因,无法连接,因此用如下方法。

vimima.sh

添加内容。

images=(
kube-apiserver:v1.23.6
kube-controller-manager:v1.23.6
kube-scheduler:v1.23.6
kube-proxy:v1.23.6
pause:3.6
etcd:3.5.1-0
coredns:v1.8.6
)
forlistin${images[@]} ; do
dockerpullregistry.cn-hangzhou.aliyuncs.com/google_containers/$list
dockertagregistry.cn-hangzhou.aliyuncs.com/google_containers/$listk8s.gcr.io/$list
done
dockertagregistry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6k8s.gcr.io/coredns/coredns:v1.8.6
shima.sh

五、集群初始化(主节点)

1、主节点创建集群

kubeadminit \
--kubernetes-version=v1.23.6 \
--pod-network-cidr=10.0.0.0/16 \
--service-cidr=10.0.0.0/12 \
--apiserver-advertise-address=172.20.10.6

记录下最后结尾的几个命令。

如果初始化失败了,使用如下命令清理环境,并重新初始化。

kubeadm reset

rm -rf $HOME/.kube

systemctl restart kubelet

2、创建必要文件

mkdir-p$HOME/.kube
sudocp-i/etc/kubernetes/admin.conf$HOME/.kube/config
sudochown$(id-u):$(id-g) $HOME/.kube/config

六、备机初始化

使用kubeadm init 结尾提示的kubeadm join语句初始化备机,如果忘记kubeadm join语句可以通过如下命令在主节点获取join命令参数:

kubeadmtokencreate--print-join-command

在两个备机执行改语句,加入集群,结果如下:

提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。

kubectlgetnodes

七、安装网络插件——calico

kubernetes支持多种网络插件,比如flannel、calica、canal等等,任选一种使用即可,本次选择calico。

网络插件没有安装的话,节点是 <font color=“#dd00dd”>NotReady</font> 状态,因为CoreDNS没有网络插件分配不到IP地址,会一直处于Pending状态。

如果没有这个插件,kubedns无法启动,pod之间就无法通信。

<font color=“#dd00dd”>只在主节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。</font><br />。

1、获取配置文件并apply

curl ​​https://projectcalico.docs.tigera.io/manifests/calico.yaml​​ -O。

2、查看服务状态,都是running了

再次查看节点状态,发现所有的节点都是 <font color=“#dd00dd”>Ready</font> 的状态了。

八、部署CoreDNS

gitclonehttps://github.com/coredns/deployment.git
yum-yinstallepel-release
yum-yinstalljq
cddeployment/kubernetes/
./deploy.sh-i10.0.0.254>coredns.yaml
kubectlapply-fcoredns.yaml

用命令查看状态,发现pod处于ContainerCreating状态。

kubectlgetpod,svc-A

使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。

kubectldescribepodcoredns-799bc9dbc6-m7q4t-nkube-system

等待一会后查看events,发现终于拉取成功了。

查看pod和svc状态,都是running的。

kubectlgetpod,svc-A

九、kubernetes-dashboard的部署

1、获取yaml文件

wgethttps://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2、增加配置,使Dashboard暴露到外部

vimrecommended.yaml

因为默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。

3、apply修改后的recommended.yaml

kubectlapply-frecommended.yaml

4、查看kubernetes-dashboard的pod状态,都已经是running的

kubectlgetpods-nkubernetes-dashboard

5、访问网址

https://NodeIP:30001。

我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001。

6、创建service account并绑定默认cluster-admin管理员集群角色:

创建用户:

kubectlcreateserviceaccountdashboard-admin-nkube-system

用户授权:

kubectlcreateclusterrolebindingdashboard-admin--clusterrole=cluster-admin--serviceaccount=kube-system:dashboard-admin

获取用户Token:

kubectldescribesecrets-nkube-system$(kubectl-nkube-systemgetsecret|awk'/dashboard-admin/{print $1}')

7、使用输出的token登录Dashboard。

可以查看当前k8s的相关信息,例如nodes,namespace等。

十、使用k8s简单部署一个nginx

1、根据yaml创建namespace

vimnginx-namespace.yaml
内容如下
apiVersion: v1#类型为Namespace
kind: Namespace#类型为Namespace
metadata:
name: ns-test#命名空间名称
labels:
name: label-test#pod标签

创建namespace:

[root@pg01 ~]# kubectl create -f nginx-namespace.yaml
namespace/ns-test created

查询namespace:

[root@pg01~]# kubectlgetnamespace
NAMESTATUSAGE
defaultActive92m
kube-node-leaseActive92m
kube-publicActive92m
kube-systemActive92m
kubernetes-dashboardActive21m
ns-testActive5s

2、创建pod

一般不直接create pod,而是通过controller来创建pod。deployment为其中一种controller

拉取nginx镜像:

dockerpullnginx

编辑pod的yaml文件:

vimnginx-deployment.yaml

内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ns-test
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
-name: nginx
image: nginx:latest
ports:
-containerPort: 80

创建:

kubectlcreate-fnginx-deployment.yaml

查询:

kubectlgetpods-nns-test
kubectlgetdeployment-nns-test

nginx-deployment 部署的2个 pod 全部成功。

查看两个nginx分配的ip。

kubectlgetpods-owide-nns-test

访问测试:

curlhttp://10.0.181.5

3、创建service

创建对应yaml文件:

vimnginx-service.yaml

内容如下:

apiVersion: v1
kind: Service
metadata:
namespace: ns-test
name: nginx-service
spec:
selector:
app: nginx
ports:
-protocol: TCP
port: 80
targetPort: 80

创建service:

kubectlcreate-fnginx-service.yaml

查看service:

kubectlgetsvcnginx-service-owide-nns-tes

访问测试:

4、暴露端口部署nginx服务

nginx-service.yaml文件如下:

apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-service
namespace: ns-test
spec:
ports:
-port: 9000
name: nginx-service
protocol: TCP
targetPort: 80 # 容器nginx对外开放的端口上面的dm已经指定了
nodePort: 31090#外网访问的端口
selector:
app: nginx
type: NodePort

部署服务。

kubectlcreate-fnginx-service.yaml

查看服务和端口。

kubectlgetsvcnginx-service-nns-test

测试如下:

浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下:

​​想了解更多关于开源的内容,请访问:​​

​​51CTO 开源基础软件社区​​

​​https://ost.IDC.NET​​。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/236146.html<

(0)
运维的头像运维
上一篇2025-04-21 21:19
下一篇 2025-04-21 21:21

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注