centos安装k8s集群(kubeadm方式)
前言环境:centos7.9本篇来讲解如何在centos下安装部署k8s集群生产环境部署k8s集群的两种方式kubeadmkubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署k8s集群。部署地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-
前言
环境: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.131 | master节点,能连外网,centos7.x版本,至少2核CPU,2G内存 |
192.168.118.132 | node1节点,能连外网,centos7.x版本,至少2核CPU,2G内存 |
192.168.118.133 | node2节点,能连外网,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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)