K8S集群的搭建

参考资料

参考视频:

https://ke.gupaoedu.cn/play/288/5/34854?phaseId=6

参考资料:

通过网盘分享的文件:02.Kubernetes

链接: https://pan.baidu.com/s/1nrYZvlnADhlDF7RarNSbZQ 提取码: m39a


概要:

本文是搭建一个主节点、两个工作节点的K8S集群,要求每个节点都安装docker ,且CPU最少两核、内存最少2G

并且保证3台机器处于同一个网段,互相之间可以ping通

本文是参考官网的生产环境安装方式,有条件的话,还是参考官网

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

本文使用的版本

```

Docker 18.09.0


kubeadm-1.14.0-0

kubelet-1.14.0-0

kubectl-1.14.0-0


k8s.gcr.io/kube-apiserver:v1.14.0

k8s.gcr.io/kube-controller-manager:v1.14.0

k8s.gcr.io/kube-scheduler:v1.14.0

k8s.gcr.io/kube-proxy:v1.14.0

k8s.gcr.io/pause:3.1

k8s.gcr.io/etcd:3.3.10

k8s.gcr.io/coredns:1.3.1


calico:v3.9

```


搭建步骤:

更新yum

每个服务器执行一下命令:

bash 复制代码
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

Docker 准备

在每个服务器上安装合适的版本

参考以下网站的步骤安装docker 版本为18.09.0https://blog.csdn.net/qq_23095607/article/details/153885161?spm=1011.2415.3001.5331

启动docker

bash 复制代码
sudo systemctl start docker && sudo systemctl enable docker

查看每个服务器是否启动成功

bash 复制代码
systemctl status docker

修改Host文件

这里最好先把IP 和 要设置域名的映射 在notepad++里面写下

bash 复制代码
192.168.124.134 m
192.168.124.135 w1
192.168.124.136 w2

m是maser节点 ,

w1是worker-01(工作节点1)

w2是worker-02(工作节点2)

1. 修改master服务器

设置master的hostname,并且修改hosts文件

bash 复制代码
sudo hostnamectl set-hostname m

然后编辑host,将上面的IP映射添加进去

bash 复制代码
vi /etc/hosts

将IP映射添加进去,

2. 修改worker-01服务器

设置worker-01的hostname,并且修改hosts文件

bash 复制代码
sudo hostnamectl set-hostname w1

然后编辑host,将上面的IP映射添加进去

bash 复制代码
vi /etc/hosts

将IP映射添加进去

3. 修改worker-02服务器

设置worker-02的hostname,并且修改hosts文件

bash 复制代码
sudo hostnamectl set-hostname w2

然后编辑host,将上面的IP映射添加进去

bash 复制代码
vi /etc/hosts

将IP映射添加进去

4. 测试

可以使用域名,ping一下试一试,比如在master节点ping两个worker节点

bash 复制代码
ping w1
ping w2

系统基础前提配置

每台服务器上:

1. 关闭防火墙

bash 复制代码
systemctl stop firewalld && systemctl disable firewalld

2. 关闭selinux

bash 复制代码
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

3. 关闭swap

bash 复制代码
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

4. 配置iptables的ACCEPT规则

bash 复制代码
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

5. 设置系统参数

bash 复制代码
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

安装kubeadm, kubelet 和 kubectl

每台服务器下,都执行以下步骤

1. 配置yum源

bash 复制代码
cat <<EOF > /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.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2. 安装kubeadm、kubelet、kubectl

先卸载一遍

bash 复制代码
sudo yum remove -y kubeadm kubelet kubectl

然后安装

bash 复制代码
yum install -y kubelet-1.14.0-0		
yum install -y kubeadm-1.14.0-0	
yum install -y kubectl-1.14.0-0

如果出现了依赖冲突,则先安装下依赖

使用如下命令安装

bash 复制代码
sudo yum install kubernetes-cni-0.7.5-0

3. docker和k8s设置同一个cgroup

bash 复制代码
vi /etc/docker/daemon.json

添加以下内容,注意用逗号,隔开

【文件没内容的话,就新建;有的话,就加上这一句,注意文件的格式逗号

bash 复制代码
"exec-opts": ["native.cgroupdriver=systemd"],

然后重新加载

bash 复制代码
systemctl daemon-reload
systemctl restart docker

4. kubelet设置

执行以下命令

【`找不到内容没关系`】

bash 复制代码
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

【`重启kubelet,一定要执行`】

bash 复制代码
systemctl enable kubelet && systemctl start kubelet

下载proxy、pause、scheduler等国内镜像

需要通过kubeadm来下载K8S需要组件的镜像

1. 查看kubeadm使用的镜像

bash 复制代码
kubeadm config images list

可以看到用的都是国外的镜像,如果你会科学上网(全局模式)应该可以直接拉取

2. 创建脚本,批量从阿里云下载镜像,并修改tag

每个节点中执行如下命令

bash 复制代码
vi kubeadm.sh

然后将下面内容添加到该文件中

bash 复制代码
set -e

KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1

GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers

images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})

for imageName in ${images[@]} ; do
  docker pull $ALIYUN_URL/$imageName
  docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done

然后执行,运行脚本(注意只在主节点执行

bash 复制代码
sh ./kubeadm.sh

然后在每个节点中查看下载的镜像

bash 复制代码
docker images

下面将部署K8S所需要的插件

初始化主节点

在初始化前,一定要检查每台服务器kubelet 的版本是否一致

bash 复制代码
 kubelet --version

选用一台服务器作为主节点,执行下面命令(需要替换下面的:kubernetes版本信息,以及IP为主节点IP)

bash 复制代码
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.124.138 --pod-network-cidr=10.244.0.0/16

【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】

【期间可能会有版本冲突,那就卸载了重新安装一下对应的版本】

保存好最后kubeadm join等信息:

在successfully后,日志会提示我们后续的操作,并生成两个token,记得保存,比如在本地创建个文件保存

保存到本地文件中

然后按照上面的提示,执行命令

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

1. 在主节点初始化成功后,可以通过语句查看已经初始化好的K8S插件

主节点中执行,查看初始化好的插件

bash 复制代码
kubectl get pods -n kube-system

可以看到除了两个DNS没有运行,其他的都运行了

还可以运行下健康检查

bash 复制代码
curl -k https://localhost:6443/healthz

2. 安装DNS网络插件

在主节点: 可以在该网址下选择需要安装的网络插件

https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/

这里我们选择Calico 插件

首先将安装Calico所需的yml文件下载下来

bash 复制代码
sudo yum install -y wget
wget https://docs.projectcalico.org/v3.9/manifests/calico.yaml

这个yml文件中有很多镜像,如果不是香港、海外服务器!,需要提前拉取到主节点中

bash 复制代码
cat calico.yaml|grep image

可以参考本人的方案进行拉取,这里使用的是方案中的是阿里云仓库+工作流下载的

需要的可以直接拉取我阿里云仓库的

bash 复制代码
# 拉取
docker pull crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-kube-controllers-v3.9.6
docker pull crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-cni-v3.9.6
docker pull crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-pod2daemon-flexvol-v3.9.6
docker pull crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-node-v3.9.6

# 改名
docker tag crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-node-v3.9.6 calico/node:v3.9.6
docker tag crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-pod2daemon-flexvol-v3.9.6 calico/pod2daemon-flexvol:v3.9.6
docker tag crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-cni-v3.9.6 calico/cni:v3.9.6
docker tag crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-kube-controllers-v3.9.6 calico/kube-controllers:v3.9.6

#删除
docker rmi crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-kube-controllers-v3.9.6
docker rmi crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-cni-v3.9.6
docker rmi crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-pod2daemon-flexvol-v3.9.6
docker rmi crpi-eoqja8fq38rifseg.ap-southeast-1.personal.cr.aliyuncs.com/docker-study-wjl/docker_hello_world:calico-node-v3.9.6

然后执行下面的命令进行DNS的初始化

bash 复制代码
kubectl apply -f calico.yaml

执行命令查看是否安装成功

bash 复制代码
kubectl get pods --all-namespaces -w

可以看到全部全部都已经跑起来了

这个结果出来,就代表主节点已经完成!!!

工作节点加入主节点

在主节点的插件都安装好以后,就需要将工作节点加入到主节点中

在前面主节点初始化后,我们保存了kubeadm join的信息

我们只需要在每个工作节点 执行kubeadm join信息,即可将工作节点加入到K8S集群中

【这里还是要强调以下,各个节点的kubectl的版本一定要一致】

bash 复制代码
kubeadm join 192.168.124.138:6443 --token wmeunc.nizafcgw4tm4okjt \
    --discovery-token-ca-cert-hash sha256:052e3b32291005afe385265cf9104374959e484963a863c50c89b5500709ba6d 

最后在主节点(master)中查看K8S集群的情况

bash 复制代码
kubectl get nodes

这样整个K8S集群就部署好了


部署测试:

如果你想部署POD测试K8S集群,可以执行下面操作

1. 在主节点中执行

bash 复制代码
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

2. 根据pod_nginx_rs.yml文件创建pod

bash 复制代码
kubectl apply -f pod_nginx_rs.yaml

3. 查看pod

bash 复制代码
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx

4. 删除测试POD

可以通过kubectl将POD进行删除

bash 复制代码
kubectl delete -f pod_nginx_rs.yaml

这样pod_nginx_rs.yaml定义的所有资源就会被删除

通过命令查看,可以看到刚才创建的POD已经被删除

bash 复制代码
kubectl get pods
相关推荐
阿里云云原生12 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉12 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情13 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海19 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色19 小时前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠20 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟20 小时前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。21 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠1 天前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙1 天前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生