centos安装k8s集群(kubeadm方式)

前言

环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.17
本篇来讲解如何在centos下安装部署k8s集群

生产环境部署k8s集群的两种方式

kubeadm
kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署k8s集群。
部署地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/、https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

二进制
从官方下载发行版的二进制包,手动部署每个组件,组成k8s集群。
下载地址:GitHub
推荐使用二进制安装部署,有助于更了解k8s。

服务器初始化、环境准备

准备3台虚拟机,1个master,2个node节点。

主机说明
192.168.118.131master节点,能连外网,centos7.x版本,至少2核CPU,2G内存
192.168.118.132node1节点,能连外网,centos7.x版本,至少2核CPU,2G内存
192.168.118.133node2节点,能连外网,centos7.x版本,至少2核CPU,2G内存

3台主机都根据实际情况做如下6大步骤配置:

#开始ntpd服务,或者做定时任务如:*/5 * * * * /usr/sbin/ntpdate -u 192.168.11.100
yum -y install ntp	
systemctl start ntpd	&& systemctl enable ntpd

systemctl stop firewalld.service && systemctl disable firewalld.service
echo "检查是否关闭防火墙:";systemctl status firewalld.service | grep -E 'Active|disabled'

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
setenforce 0
echo "检查是否关闭selinux:";getenforce && grep 'SELINUX=disabled' /etc/selinux/config

sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a
echo "检查swap是否关闭:";grep -i 'swap' /etc/fstab;free -h | grep -i 'swap'
#设置主机名
cat >> /etc/hosts <<EOF
192.168.118.131 master
192.168.118.132 node1
192.168.118.133 node2
EOF

将桥接的IPv4流量传递到iptables的链(有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置kubernetes.conf文件(kubernetes.conf文件原来不存在,需要自己创建的)

touch /etc/sysctl.d/kubernetes.conf
cat >> /etc/sysctl.d/kubernetes.conf <<EOF && sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF		

使用kubeadm安装k8s(本篇讲解使用kubeadm安装k8s)

以上6大步骤在每一台虚拟机做完之后,开始安装k8s。本篇讲解使用kubeadm安装k8s),kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署。
1、创建一个master节点,kubeadm init
2、将node节点加入kubernetes集群,kubeadm join <master_IP:port >

步骤一、安装docker(在所有节点服务器上都执行,因为k8s1.23版本之前默认CRI为docker,cri称之为容器运行时)

#在所有3台虚拟机上都要安装docker
#先删除旧的docker版本
yum remove docker* -y
#安装yum-utils,主要提供yum-config-manager命令									
yum install -y yum-utils
#下载并安装docker的repo仓库(下载失败的话使用阿里云的docker仓库)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# centos7停止维护了所以使用阿里云的docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看可获取的docker版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本docker-20.10,因为k8s 1.22.17最新的验证版本是docker-20.10
#yum -y install docker-ce docker-ce-cli containerd.io
yum -y install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
#启动docker并设置开机自启
systemctl enable --now docker
#设置镜像加速器
mkdir /etc/docker
cat >>/etc/docker/daemon.json<<'EOF'
{
    "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker
#检查加速器配置是否成功											
docker info |tail -5
#docker 配置命令自动补全
yum install bash-completion -y
#下载不了则跳过
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
source /etc/bash_completion.d/docker-compose									

步骤二、配置kubernetes的阿里云yum源(所有节点服务器都需要执行)

#在3台虚拟机都配置k8s的yum源
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安装kubeadm、kubelet、kubectl(所有节点都执行)

#在3台虚拟机上都执行安装kubeadm、kubelet、kubectl(kubeadm和kubectl都是工具,kubelet才是系统服务)
#查看yum可获取的kubeadm版本,这里安装1.22.17版本,不指定版本的话默认安装最新版本
yum list --showduplicates | grep  kubeadm
#安装kubeadm、kubelet、kubectl
yum -y install kubelet-1.22.17 kubeadm-1.22.17 kubectl-1.22.17
#设置kubelet开机自启(先不用启动,也起不了,后面kubeadm init初始化master时会自动拉起kubelet)
systemctl enable kubelet

步骤四、初始化master节点的控制面板

#提前拉取镜像,加快安装(此步骤可做可不做)
#master节点提前拉取镜像,这里使用阿里云的镜像
kubeadm  config images list --kubernetes-version=v1.22.17 --image-repository=registry.aliyuncs.com/google_containers
kubeadm  config images pull --kubernetes-version=v1.22.17 --image-repository=registry.aliyuncs.com/google_containers
# kubeadm init --help可以查看命令的具体参数用法
#在master节点执行初始化(node节点不用执行)
kubeadm init \
--apiserver-advertise-address=192.168.118.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.17 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
参数说明:
--apiserver-advertise-address=192.168.118.131 \								#指定apiserver的IP,即master节点的IP
--image-repository registry.aliyuncs.com/google_containers \				#设置镜像仓库为国内的阿里云镜像仓库
--kubernetes-version v1.22.17 \												#设置k8s的版本,跟步骤三的kubeadm版本一致
--service-cidr=10.96.0.0/12 \												#这是设置node节点的网络的,暂时这样设置
--pod-network-cidr=10.244.0.0/16											#这是设置node节点的网络的,暂时这样设置

#如果没提前拉取镜像,可以再开一个窗口,执行docker images可以看到,其实执行kubeadm init时k8s会去拉取了好多镜像
[root@master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.22.17   d35b182b4200   2 weeks ago     128MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.22.17   63f3f385dcfe   2 weeks ago     104MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.22.17   3618e4ab750f   2 weeks ago     122MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.22.17   9fe44a6192d1   2 weeks ago     52.7MB
registry.aliyuncs.com/google_containers/etcd                      3.5.0-0   004811815584   7 months ago    295MB
registry.aliyuncs.com/google_containers/coredns                   v1.8.4    8d147537fb7d   8 months ago    47.6MB
registry.aliyuncs.com/google_containers/pause                     3.5       ed210e3e4a5b   10 months ago   683kB
#如果报错了,需要重新开始初始化master节点
kubeadm reset												#清除kubeadm init做的配置
iptables -F
yum install ipvsadm  -y 
ipvsadm --clear
rm -rf $HOME/.kube/config
[root@master ~]# kubeadm init \												#在master节点执行初始化(node节点不用执行)
--apiserver-advertise-address=192.168.118.131 \								#指定apiserver的IP,即master节点的IP
--image-repository registry.aliyuncs.com/google_containers \				#设置镜像仓库为国内的阿里云镜像仓库
--kubernetes-version v1.22.17 \												#设置k8s的版本,跟步骤三的kubeadm版本一致
--service-cidr=10.96.0.0/12 \												#这是设置node节点的网络的,暂时这样设置
--pod-network-cidr=10.244.0.0/16											#这是设置node节点的网络的,暂时这样设置

#最后kubeadm init初始化成功,提示信息如下:
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														#这3步是配置kubectl工具在master节点实现管理
  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.								#提示我们去配置pod网络,步骤六再配置
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 192.168.118.131:6443 --token o6mdo3.fhfvz4vzmcrr6hsm \
        --discovery-token-ca-cert-hash sha256:8a80625d031f09efa43532360585b63dc2778a26435a9a4a6319cbf9f5acf91b 

#我们根据上面输入的提示信息复制粘贴照着做即可,在master节点操作:
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

#kubectl 配置命令自动补全
yum install -y bash-completion
echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
echo 'source  <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

步骤五、将node节点加入k8s集群

#在步骤四初始化完成master节点之后会提示你在node节点执行如下的命令来将node节点加入k8s集群,如下所示,复制它到node节点执行即可;
#注意:这段kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create --print-join-command 重新生成。
#执行kubeadm token create --print-join-command 重新生成的命令,打印输出来是默认node角色的,如果新节点是作为master节点角色,那么
#需要在打印出来的命令后面添加--control-plane 参数再执行。 
kubeadm join 192.168.118.131:6443 --token o6mdo3.fhfvz4vzmcrr6hsm \
        --discovery-token-ca-cert-hash sha256:8a80625d031f09efa43532360585b63dc2778a26435a9a4a6319cbf9f5acf91b

[root@node1 ~]# kubeadm join 192.168.118.131:6443 --token o6mdo3.fhfvz4vzmcrr6hsm \			#在node1、node2节点执行
>         --discovery-token-ca-cert-hash sha256:8a80625d031f09efa43532360585b63dc2778a26435a9a4a6319cbf9f5acf91b

步骤六、部署容器网络,CNI网络插件

#在master节点配置pod网络创建
#node节点加入k8s集群后,在master上执行kubectl get nodes发现状态是NotReady,因为还没有部署CNI网络插件,其实在步骤四初始化
#完成master节点的时候k8s已经叫我们去配置pod网络了。在k8s系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为
#著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。

#执行下面这条命令在线配置pod网络,因为是国外网站,所以可能报错,测试去http://ip.tool.chinaz.com/网站查到
#域名raw.githubusercontent.com对应的IP,把域名解析配置到/etc/hosts文件,然后执行在线配置pod网络,多尝试几次即可成功。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml					
#查看pod状态,全部是Running状态即为正常
kubectl get pods -n kube-system
#查看节点状态全部是Ready则表明pod网络已经配置成功
kubectl get nodes										

步骤七、测试k8s集群
在k8s中创建一个pod,验证是否正常运行:

kubectl create deployment httpd --image=httpd
kubectl expose deployment httpd --port=80 --type=NodePort
#状态是Running即为正常
kubectl get pod | grep -i httpd
#获取httpd访问url
echo $(kubectl get node -owide | grep  'control-plane' | awk '{print $6}'):\
$(kubectl get service/httpd | grep -v NAME  | awk '{print $5}' | awk  -F':' '{print $2}' | awk -F'/' '{print $1}')

网页测试访问,使用master节点的IP或者node节点的IP都可以访问,端口就是30176,如下所示,这就说明我们k8s网络ok。
在这里插入图片描述
步骤八、测试coredns域名解析

cat<<'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - image: busybox:1.24.1
    command:
      - sleep
      - "99999999999999"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
EOF
kubectl  exec -it busybox -- nslookup kubernetes.default
kubectl  exec -it busybox -- nslookup kube-dns.kube-system
#返回类似于,则说明dns解析正常
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kube-dns.kube-system
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

** 步骤九、配置kubectl命令自动补全 **

yum install -y bash-completion
echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
echo 'source  <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
kubectl describe nodes

至此,k8s部署完成。

后记-k8s使用外部etcd集群

以上在kubeadm init命令执行初始化集群的时候默认是使用pod创建的etcd数据库,如果已经存在有一个外部etcd集群,则可以通过创建配置文件,配置文件中定义etcd集群节点,然后使用配置文件来初始化k8s集群,如下示例:

#前提条件:存在一个etcd集群,单节点亦可,这里使用已经搭建好的3节点etcd集群
#如果还没有etcd集群,则可参考文章创建:https://blog.csdn.net/MssGuo/article/details/134495748
#生成集群配置文件
kubeadm config print init-defaults > init-defaults.yaml
#查看并修改集群配置文件
cat init-defaults.yaml 
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.118.131		#改成master节点IP
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: master				#master节点主机名
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:				#这里使用外部etcd集群,删除默认字段,添加下面的字段
  external:  		# 使用外部etcd集群,主要是配置etcd集群url以及证书
    endpoints:
    - https://192.168.118.131:2379
    - https://192.168.118.132:2379
    - https://192.168.118.133:2379
    caFile: /etc/etcd/pki/ca.pem
    certFile: /etc/etcd/pki/server.pem
    keyFile: /etc/etcd/pki/server-key.pem
imageRepository: registry.aliyuncs.com/google_containers	#阿里云的镜像仓库
kind: ClusterConfiguration
kubernetesVersion: 1.22.17		#k8s的版本号
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16		#pod的网段
  serviceSubnet: 10.96.0.0/12	#svc的网段
scheduler: {}
#使用集群配置文件初始化k8s集群
kubeadm init --config=init-defaults.yaml
  • 20
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值