kubeadm来快速搭建一个K8S集群

二进制搭建适合大集群,50台以下的主机

kubeadm更适合中下企业的业务集群

我们采用了二进制包搭建出的k8s集群,本次我们采用更为简单的kubeadm的方式来搭建k8s集群。

二进制的搭建更适合50台主机以上的大集群,kubeadm更适合中小型企业的集群搭建

主机节点 IP 组件

master 20.0.0.61 docker、kubeadm、kubelet、kubectl、flannel

node01 20.0.0.62 docker、kubeadm、kubelet、kubectl、flannel

node02 20.0.0.63 docker、kubeadm、kubelet、kubectl、flannel

Harbor节点 20.0.0.64 docker、docker-compose、harbor-offline-v1.2.2

在所有节点上安装Docker和kubeadm

部署Kubernetes Master

部署容器网络插件

部署 Kubernetes Node,将节点加入Kubernetes集群中

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

部署 Harbor 私有仓库,存放镜像资源

1,环境准备

//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

sed -i 's/enforcing/disabled/' /etc/selinux/config

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

swapoff -a #交换分区必须要关闭

sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果

#加载 ip_vs 模块

for i in (ls /usr/lib/modules/(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo i; /sbin/modinfo -F filename i >/dev/null 2>&1 && /sbin/modprobe $i;done

//修改主机名

hostnamectl set-hostname master01

hostnamectl set-hostname node01

hostnamectl set-hostname node02

//所有节点修改hosts文件

vim /etc/hosts

20.0.0.61 master01

20.0.0.62 node01

20.0.0.63 node02

//调整内核参数

cat > /etc/sysctl.d/kubernetes.conf << EOF

#开启网桥模式,可将网桥的流量传递给iptables链

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

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

#关闭ipv6协议

net.ipv6.conf.all.disable_ipv6=1

net.ipv4.ip_forward=1

EOF

//生效参数

sysctl --system

2、所有节点安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce docker-ce-cli containerd.io

mkdir /etc/docker

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

{

"registry-mirrors": ["https://pkm63jfy.mirror.aliyuncs.com"],

"exec-opts": ["native.cgroupdriver=systemd"],

"log-driver": "json-file",

"log-opts": {

"max-size": "100m"

}

}

EOF

systemctl daemon-reload

systemctl restart docker.service

systemctl enable docker.service

docker info | grep "Cgroup Driver"

Cgroup Driver: systemd

3、所有节点安装kubeadm,kubelet和kubectl

//定义kubernetes源

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 install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

//开机自启kubelet

systemctl enable kubelet.service

#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

//查看初始化需要的镜像

kubeadm config images list --kubernetes-version 1.20.15

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

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

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

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

k8s.gcr.io/pause:3.2

k8s.gcr.io/etcd:3.4.13-0

k8s.gcr.io/coredns:1.7.0

pause镜像是 Kubernetes Pod 中一个特殊容器所使用的基础容器。这个容器的作用是保持 Pod 中其他容器的运行。

在 Kubernetes 中,Pod 是最小的可部署单元,通常包含一个或多个容器。pause 容器的主要作用是创建一个网络命名空间,

并在该网络命名空间内创建一个网络命名空间隔离的 Linux 进程。其他容器将加入这个网络命名空间,共享网络命名空间的网络栈。

这种设计的好处是,即使 Pod 中的容器是用不同的编程语言或框架编写的,

它们仍然可以在同一网络空间中通信。pause 容器充当了这种网络命名空间的主要协调者。

当 Pod 中的所有容器退出时,pause 容器也退出,从而释放 Pod 的网络命名空间

//初始化kubeadm

master操作:

kubeadm init \

--apiserver-advertise-address=20.0.0.61 \

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

--kubernetes-version=v1.20.15 \

--service-cidr=10.96.0.0/16 \

--pod-network-cidr=10.244.0.0/16 \

--token-ttl=0


初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。

可选参数:

--apiserver-advertise-address:apiserver通告给其他组件的IP地址,

一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址

--apiserver-bind-port:apiserver的监听端口,默认是6443

--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki

--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加

--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io

--kubernetes-version:指定kubernetes版本

--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;

--service-cidr:service资源的网段

--service-dns-domain:service全域名的后缀,默认是cluster.local

--token-ttl:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参数


kubeadm join 20.0.0.61:6443 --token h43seb.f7l2m61rfa2lfsyd \

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

#在node节点加入集群

//设定kubectl

master上操作:

kubectl需经由API server认证及授权后方能执行相应的管理操作,

kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,

它可由 kubectl 通过默认的 "$HOME/.kube/config" 的路径进行加载。

mkdir -p $HOME/.kube

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

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

systemctl restart kubelet

初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

kubectl edit cm kube-proxy -n=kube-system

修改mode: ipvs

kubectl get cs 发现集群不健康,更改以下两个文件

MSTER操作:

vim /etc/kubernetes/manifests/kube-scheduler.yaml

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

修改如下内容

把--bind-address=127.0.0.1变成--bind-address=20.0.0.61

#修改成k8s的控制节点master01的ip

把httpGet:字段下的hosts由127.0.0.1变成20.0.0.61(有两处)

#- --port=0 # 搜索port=0,把这一行注释掉

systemctl restart kubelet

kubectl get node

kubectl get csr

//所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录

master节点上传 kube-flannel.yml 文件

cd /opt

docker load < flannel.tar

mv /opt/cni /opt/cni_bak

mkdir -p /opt/cni/bin

tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin

//在 master 节点创建 flannel 资源

kubectl apply -f kube-flannel.yml

kubectl get node

kubectl get csr

#删除node节点(master01也能成为node节点,可以不删除)

kubectl delete node master01

#证书有效期的问题,kubeadm默认只有1年:

openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text | grep Not

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not

将更新证书有效期脚本上传到/opt中

./update-kubeadm-cert.sh all

执行脚本即可、

//在master节点查看节点状态

kubectl get nodes

kubectl get pods -n kube-system

//测试 pod 资源创建

kubectl create deployment nginx --image=nginx

kubectl get pods -o wide

//暴露端口提供服务

kubectl expose deployment nginx --port=80 --type=NodePort

进入pod修改页面

kubectl get svc

//测试访问

curl ​​​​​​http://node01:30302

//缩容副本

kubectl scale deployment nginx --replicas=3

kubectl get pods -o wide

安装 部署与k8s集群对接的Harbor仓库

在66主机上操作

//上传 harbor-offline-installer-v2.8.1.tgz 和 docker-compose 文件到 /opt 目录

cd /opt

cp docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

tar zxvf harbor-offline-installer-v2.8.1.tgz

cd harbor/

vim harbor.yml

hostname = hub.test.com

https:

https port for harbor, default is 443

port: 443

The path of cert and key files for nginx

certificate: /data/cert/server.crt

private_key: /data/cert/server.key

harbor_admin_password = 123456

//生成证书

mkdir -p /data/cert

cd /data/cert

#生成私钥

openssl genrsa -des3 -out server.key 2048

输入两遍密码:123456

openssl genrsa: 用于生成 RSA 密钥。

-des3: 使用 Triple DES 加密算法对生成的私钥进行加密。

-out server.key: 指定生成的私钥文件的名称为 server.key。

2048: 指定 RSA 密钥的位数为 2048 位。

#生成证书签名请求文件

openssl req -new -key server.key -out server.csr

输入私钥密码:123456

输入国家名:CN

输入省名:BJ

输入市名:BJ

输入组织名:TEST

输入机构名:TEST

输入域名:hub.kgc.com

输入管理员邮箱:[email protected]

其它全部直接回车

#备份私钥

cp server.key server.key.org

#清除私钥密码

openssl rsa -in server.key.org -out server.key

输入私钥密码:123456

#签名证书

openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

chmod +x /data/cert/*

cd /opt/harbor/

./prepare

./install.sh

在本地使用火狐浏览器访问:https://20.0.0.66

添加例外 -> 确认安全例外

用户名:admin

密码:123456

node1节点:

mkdir -p /etc/docker/certs.d/hub.test.com/

在harbor节点把密钥验证目录整个转给node节点:

scp -r /data/ [email protected]:/

把刚才的生成的密钥文件放入:

node节点:

cd /data/cert

cp server.crt server.csr server.key /etc/docker/certs.d/hub.test.com/

cd /etc/docker/certs.d/hub.test.com/

root@node01 hub.test.com\]# ls server.crt server.csr server.key ![](https://file.jishuzhan.net/article/1742491916466917377/53522943c3cebdc6600fb0ef02346437.webp) vim /etc/hosts 20.0.0.66 hub.test.com vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=hub.test.com ![](https://file.jishuzhan.net/article/1742491916466917377/8e0a09bf76c4f7e1cb3d213eb1f935a0.webp) systemctl daemon-reload systemctl restart docker 登录到harbor: docker login -u admin -p 123456 https://hub.test.com docker tag nginx:latest hub.test.com/library/nginx:v1 docker push hub.test.com/library/nginx:v1 ![](https://file.jishuzhan.net/article/1742491916466917377/f132911a0a896a1dfb85ff54472da29e.webp) ![](https://file.jishuzhan.net/article/1742491916466917377/14a1c51cb9eb0dc72ea1f45ef8c274e0.webp) ****//在master节点上删除之前创建的nginx资源**** kubectl delete deployment nginx ****通过harbor仓库拉取镜像,创建pod,暴露端口为80,副本数为3**** kubectl create deployment myapp-test --image=hub.test.com/library/nginx:v1 --port=80 --replicas=3 kubectl expose deployment myapp-test --port=30000 --target-port=80 kubectl get svc,pods ![](https://file.jishuzhan.net/article/1742491916466917377/7da319ba1b06fad689d483a28fc8ff41.webp) yum install ipvsadm -y ipvsadm -Ln #通过clusterip+端口号 进行访问 curl 10.96.199.149:30000 ![](https://file.jishuzhan.net/article/1742491916466917377/f88b57ae740beb0bf3b70d72b319b268.webp) kubectl edit svc myapp-test 25 type: NodePort #把调度策略改成NodePort kubectl get svc ![](https://file.jishuzhan.net/article/1742491916466917377/645bac25a214d9c6e210fd7c9b1c7c6b.webp) 浏览器访问: http://20.0.0.61:32148/ http://20.0.0.62:32148/ http://20.0.0.63:32148/ ![](https://file.jishuzhan.net/article/1742491916466917377/b383029736b7c45f89cf080db44a7225.webp) #将cluster-admin角色权限授予用户system:anonymous kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous ****Dashboard:**** 仪表盘,kubernetes的可视化界面。在这个可视化界面上,可以对集群进行管理 安装dashhoard 在 master01 节点上操作 #上传 recommended.yaml 文件到 /opt/k8s 目录中 cd /opt/k8s 文件不需要更改 kubectl apply -f recommended.yaml 创建service account并绑定默认cluster-admin管理员集群角色 kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin #获取token值 kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret \| awk '/dashboard-admin/{print $1}') ![](https://file.jishuzhan.net/article/1742491916466917377/d80815d7f0c92d035dea1966587cdb24.webp) #使用输出的token登录Dashboard https://20.0.0.63:30001 ![](https://file.jishuzhan.net/article/1742491916466917377/0c16f9481ec253a82b54c51e4bfaeade.webp)

相关推荐
不学无术の码农4 小时前
Ubuntu 22.04 (WSL2) 上使用 Docker 安装 Nacos 3.0.0
ubuntu·docker
AnnyYoung6 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
慧一居士6 小时前
Docker Compose 的详细使用总结、常用命令及配置示例
容器·架构
何怀逸6 小时前
安装 Docker
运维·docker·容器
码码哈哈0.06 小时前
2025最新:3分钟使用Docker快速部署单节点Redis
redis·docker·eureka
小马爱打代码6 小时前
K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战
ci/cd·kubernetes·gitlab
云攀登者-望正茂6 小时前
通过Kubernetes 外部 DNS控制器来自动管理Azure DNS 和 AKS
容器·kubernetes·azure
裁二尺秋风7 小时前
k8s(11) — 探针和钩子
java·容器·kubernetes
格桑阿sir9 小时前
Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
kubernetes·controller·endpoint·hpa·job·garbege·lease
Sahas10199 小时前
debian安装docker
docker·eureka·debian