K8s集群部署

news/2024/6/3 18:42:12 标签: kubernetes, docker, 容器

 #部署方式有多种,本文采用kubeadm组件的方式来部署K8s集群

安装要求:

  • 至少三台主机
  • 内存最少2G,CPU2核
  • 集群网络互通
  • 可以访问外网
  • 禁止swap分区

环境说明:

系统:ubuntu22.04.1 

版本信息:kubernetes:1.26.2 ,docker-ce:23.0.1 ,cri-docker:0.3.1

ip及节点概况:master:10.0.0.200,node1:10.0.0.201,node2:10.0.0.202 

部署前的准备:

#以下操作在全部节点上都要执行

1.设定时钟同步

apt install -y chrony
systemctl start chrony.service

2.设置主机名称解析

vim /etc/hosts
10.0.0.200 k8s-master.zhang.com
10.0.0.201 k8s-node1.zhang.com
10.0.0.202 k8s-node2.zhang.com

 3.禁用swap设备

1)关闭当前已启用的所有Swap设备

swapoff -a

2)编辑/etc/fstab,注释用于挂载swap设备的所有行,然后保存退出

 3)可以用free命令查看swap的使用情况,为0即可

 4.禁用防火墙服务

ufw disable
ufw status

部署k8s集群: 

  • 安装相关组件

1.部署docker

阿里云官方配置说明

#首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:

1)安装docker 

apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt -y install docker-ce

2)添加配置

#kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务

vim /etc/docker/daemon.json
{
"registry-mirrors": [
  "https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "200m"
},
"storage-driver": "overlay2"  
}

3)配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导

systemctl daemon-reload;systemctl start docker.service;systemctl enable docker.service

2.安装cri-docker

#GitHub网站可能需要科学上网才能访问

curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
apt install -y ./cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
systemctl status cri-docker.service

3.安装kubelet、kubeadm和kubectl

阿里云官方配置说明

#首先,在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:

apt update && apt install -y apt-transport-https curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

EOF
 apt update
apt install -y kubelet kubeadm kubectl
systemctl enable kubelet

 #安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号

1.配置cri-dockerd

#确保其能够正确加载到CNI插件,编辑/usr/lib/systemd/system/cri-docker.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容:

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

需要添加的各配置参数说明(各参数的值要与系统部署的CNI插件的实际路径相对应):

  • --network-plugin:指定网络插件规范的类型,这里要使用CNI;

  • --cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;

  • --cni-cache-dir:CNI插件使用的缓存目录;

  • --cni-conf-dir:CNI插件加载配置文件的目录;

配置完成后,重载并重启cri-docker.service服务:

systemctl daemon-reload;systemctl restart cri-docker.service

2.配置kubelet

#配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet(若/etc/sysconfig目录不存在,则需要先创建该目录),为其添加 如下指定参数:

mkdir /etc/sysconfig
vim /etc/sysconfig/kubelet
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"

#需要说明的是,该配置也可不进行,而是直接在后面的各kubeadm命令上使用“--cri-socket unix:///run/cri-dockerd.sock”选项

  • 初始化master节点

#需要说明的是由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,常见的解决方案有两种,1是使用能够达到该服务的代理服务,2是使用国内的镜像服务器上的服务,例如:registry.aliyuncs.com/google_containers等

kubeadm init \        
--control-plane-endpoint="k8s-master.zhang.com" \
--kubernetes-version=v1.26.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--token-ttl=0 \
--cri-socket unix:///run/cri-dockerd.sock \
--upload-certs \ 
--image-repository=registry.aliyuncs.com/google_containers

命令中各选项的说明:

  • --image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;

  • --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;

  • --control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;

  • --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;

  • --service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;

  • --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;

  • --token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。kubeadm token create --print-join-command

  • 初始化后的操作

下面是系统给的提示:

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

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/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
    --discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
    --control-plane --certificate-key 2ca266fb50ac46f0bc7852fe83295cfc582d2ac25f36d06708c289cd4ebb0886

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
    --discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 

我们可以按照系统给的提示来执行:

1.Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件

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

#下面定义环境变量的方法也可:

export KUBECONFIG=/etc/kubernetes/admin.conf

2.部署网络插件(此步在所有节点执行)

mkdir /opt/bin/
curl -L https://github.com/flannel-io/flannel/releases/download/v0.21.2/flanneld-amd64  -o /opt/bin/flanneld
chmod +x /opt/bin/flanneld

#向Kubernetes部署kube-flannel,(下面一步在master节点执行):

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml

用下面命令确认pod的状态为"Running",即kube-flannel已正常运行:

kubectl get pods -n kube-flannel

 3.用下面命令验证master节点已经就绪

kubectl get nodes

  •  添加节点至集群中

1.使用系统给的提示中的kubeadm join命令

#需要说明的是,每个节点的token值都是不一样的,不要复制我这里的,看系统给的提示;

选项--cri-socket unix:///run/cri-dockerd.sock需要额外加上

kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
--discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
--cri-socket unix:///run/cri-dockerd.sock

2.使用下面命令验证节点添加结果

kubectl get nodes

  •  测试应用编排及服务访问

#我们部署一个nginx来进行测试

1.创建Deployment部署Nginx

kubectl create deployment nginx --image=nginx:1.22-alpine --replicas=1
kubectl get pods

 2.创建Service暴露Nginx

kubectl create service nodeport nginx --tcp=80:80
kubectl get service

  

nginx集群外部的访问端口是30799,我们就可以通过http://10.0.0.200:30799进行访问:


http://www.niftyadmin.cn/n/123733.html

相关文章

Linux入侵检测方法

前言 本文为总结了几种常见的Linux入侵检测方法&#xff0c;参考了csdn中多篇文章&#xff0c;参考链接放在文末。 个人总结 1进程2端口3日志4流量5计划 查看可疑进程 查看进程数量&#xff0c;运行状态 命令&#xff1a;top 动态查看进程信息&#xff08;每三秒更新一次…

大数据处理技术导论(7) | Datawhale组队学习46期

文章目录7. spark 理论学习总结7.1 spark 与 hadoop 框架区别7.2 spark 编程模型 RDD7.3 spark 结构原理2. spark 实战项目地址 https://github.com/datawhalechina/juicy-bigdata&#xff0c;感谢项目团队的付出。本次主要学习 spark 相关内容。本章节以思维导图的方式呈现课…

Vue3 核心模块源码解析(中)

【Vue3 核心模块源码解析(上)】讲到了 Vue2 与 Vue3的一些区别&#xff0c;Vue3 新特性的使用&#xff0c;以及略微带了一点源码。那么这篇文章就要从Vue3 模块源码解析 与 Vue3 执行逻辑解析这两个方面去给大家剖析 Vue3 的深层次&#xff0c;一起学习起来吧&#xff01; 这里…

示范Node.js实现JSON Web Token(JWT)的代码教程与范例

目录 0.Node.js和JWT 1.为什么需要会话管理 2.session和cookies 3.jwt的定义 4.jwt的原理 5.jwt的认证流程 6.jwt的数据结构 7.jwt使用方式 8.在koa项目中使用 9.原理的实现 10.jwt的优缺点 0.Node.js和JWT 当涉及到Web开发和服务器端编程时&#xff0c;Node.js是一…

zookeeper安装使用

一、因使用kafka 需使用zookeeper,此处使用单节点 ZooKeeper有两种安装模式&#xff0c;最简单的方式是单机模式&#xff08;standalone mode&#xff09;&#xff0c;它只需要在一台机器上面运行&#xff0c;另一种方式是集群模式&#xff0c;集群模式需要多台服务器部署。 Z…

谈谈软件的持续交付

一、背景 在软件产品的生命周期中涉及到新想法的探索、对环境的变化、或者用户的问题快速响应&#xff0c;以及实现大规模的快速开发。---《Google软件工程》 持续交付&#xff08;Continuous Delivery&#xff09;是一种软件开发方法&#xff0c;它强调在开发过程中实现快速…

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

操作系统之进程管理---每天一点点(春招加油呀)--知识点回顾(自问自答版本总结)

1.什么是进程&#xff1f;什么是线程&#xff1f;进程和线程的区别&#xff1f; 进程&#xff1a;资源分配和管理的基本单位 线程&#xff1a;程序执行的最小单位。 区别&#xff1a; 地址空间&#xff1a; 同一进程的所有线程共享本进程的地址空间&#xff0c;而不同的进程之间…