Kubernetes二进制部署k8s集群

1、简介

在Kubernetes集群中进行二进制包的部署管理是一项关键而复杂的任务。这种方法通常用于定制化的部署场景,允许更灵活地配置和管理集群。kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。我们这里以学习为主就只在主节点部署一个实例。

2、环境准备

准备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、初始化环境

#开始ntpd服务,或者做定时任务如:*/5 * * * * /usr/sbin/ntpdate -u ntp2.aliyun.com
[root@master ~]# yum -y install ntp
[root@master ~]# systemctl start ntpd&& systemctl enable ntpd

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

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

#关闭swap分区
[root@master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@master ~]# swapoff -a
[root@master ~]# echo "检查swap是否关闭:";grep -i 'swap' /etc/fstab;free -h | grep -i 'swap'

#设置主机名
[root@master ~]# cat >> /etc/hosts <<EOF
192.168.118.131 master
192.168.118.132 node1
192.168.118.133 node2
EOF

4、将桥接的IPv4流量传递到iptables的链

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

[root@master ~]# touch /etc/sysctl.d/kubernetes.conf
[root@master ~]# 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

5、安装docker(所有节点服务器都需要执行)

在所有3台虚拟机上都要安装docker

#先删除旧的docker版本
[root@master ~]# yum remove docker* -y

#安装yum-utils,主要提供yum-config-manager命令
[root@master ~]# yum install -y yum-utils

#下载并安装docker的repo仓库
[root@master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#查看可获取的docker版本
[root@master ~]# yum list docker-ce --showduplicates | sort -r

#安装指定版本docker-20.10,因为k8s 1.22.17最新的验证版本是docker-20.10
[root@master ~]# yum -y install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io

#启动docker并设置开机自启
[root@master ~]# systemctl enable --now docker

#设置镜像加速器
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat >>/etc/docker/daemon.json<<'EOF'
{
   "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

#重启docker
[root@master ~]# systemctl restart docker

#检查加速器配置是否成功
[root@master ~]# docker info |tail -5

#docker 配置命令自动补全
[root@master ~]# yum install bash-completion -y

#下载不了则跳过
[root@master ~]# sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
[root@master ~]# source /etc/bash_completion.d/docker-compose

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

[root@master ~]# 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

7、yum安装kubeadm、kubelet、kubectl(所有节点都执行)

#查看yum可获取的kubeadm版本,这里安装1.22.17版本,不指定版本的话默认安装最新版本
[root@master ~]# yum list --showduplicates | grep kubeadm

#安装kubeadm、kubelet、kubectl
[root@master ~]# yum -y install kubelet-1.22.17 kubeadm-1.22.17 kubectl-1.22.17

#设置kubelet开机自启(先不用启动,也起不了,后面kubeadm init初始化master时会自动拉起kubelet)
[root@master ~]# systemctl enable kubelet

8、初始化master节点的控制面板

提前拉取镜像,加快安装(此步骤可做可不做)
#master节点提前拉取镜像,这里使用阿里云的镜像
[root@master ~]# kubeadm config images list --kubernetes-version=v1.22.17 --image-repository=registry.aliyuncs.com/google_containers
[root@master ~]# kubeadm config images pull --kubernetes-version=v1.22.17 --image-repository=registry.aliyuncs.com/google_containers

#在master节点执行初始化(node节点不用执行)
[root@master ~]# 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   2weeks ago     128MB
registry.aliyuncs.com/google_containers/kube-proxy               v1.22.17   63f3f385dcfe   2weeks 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   2weeks ago     52.7MB
registry.aliyuncs.com/google_containers/etcd                      3.5.0-0   004811815584   7months ago   295MB
registry.aliyuncs.com/google_containers/coredns                   v1.8.4   8d147537fb7d   8months ago    47.6MB
registry.aliyuncs.com/google_containers/pause                     3.5       ed210e3e4a5b   10months ago

重新初始化

如果报错了,需要重新开始初始化master节点
#清除kubeadm init做的配置
[root@master ~]# kubeadm reset
[root@master ~]# iptables -F
[root@master ~]# yum install ipvsadm -y 
[root@master ~]# ipvsadm --clear
[root@master ~]# rm -rf $HOME/.kube/config

#在master节点执行初始化(node节点不用执行)
[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-hashsha256: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

9、将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 参数再执行。 
[root@node1 ~]# kubeadm join 192.168.118.131:6443 --token o6mdo3.fhfvz4vzmcrr6hsm \
       --discovery-token-ca-cert-hashsha256:8a80625d031f09efa43532360585b63dc2778a26435a9a4a6319cbf9f5acf91b

<!–注意:这段kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create –print-join-command 重新生成。执行kubeadm token create –print-join-command 重新生成的命令,打印输出来是默认node角色的,如果新节点是作为master节点角色,那么需要在打印出来的命令后面添加–control-plane 参数再执行。–>

10、部署容器网络,CNI网络插件

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

#下载
[root@master ~]# git clone https://gitee.com/huqi2020/k8s-network.git

#在master节点配置pod网络创建(也可以选择flannel网络)
[root@master ~]# kubectl apply -f calico.yaml

#查看pod状态,全部是Running状态即为正常
[root@master ~]# kubectl get pods -n kube-system

#查看节点状态全部是Ready则表明pod网络已经配置成功
[root@master ~]# kubectl get nodes

11、测试k8s集群

[root@master ~]# kubectl create deployment httpd --image=httpd
[root@master ~]# kubectl expose deployment httpd --port=80 --type=NodePort

#状态是Running即为正常
[root@master ~]# kubectl get pod | grep -i httpd
#获取httpd访问url
[root@master ~]# 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}')

12、测试coredns域名解析

[root@master ~]# 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

[root@master ~]# kubectl exec -it busybox -- nslookup kubernetes.default
[root@master ~]# 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

13、配置kubectl命令自动补全

[root@master ~]# yum install -y bash-completion
[root@master ~]# echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
[root@master ~]# echo 'source <(kubectl completion bash)' >> ~/.bashrc
[root@master ~]# source ~/.bashrc
[root@master ~]# kubectl describe nodes

14、外部etcd集群

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

前提条件:存在一个etcd集群,单节点亦可,这里使用已经搭建好的3节点etcd集群

#生成集群配置文件
[root@master ~]# kubeadm config print init-defaults > init-defaults.yaml

#查看并修改集群配置文件
[root@master ~]# 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集群
[root@master ~]# kubeadm init --config=init-defaults.yaml

声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/415123.html

(0)
联系我们
联系我们
分享本页
返回顶部