k8s集群的搭建
一、k8s集群搭建的方式
目前k8s集群搭建的方式有两种,分别为:
- kubeadm
- 二进制包
这两种方式各有优劣,其中kubeadm是一个k8s的部署工具,提供kubeadm init和kubeadm join用于快速部署k8s集群;二进制包的方式需要手动部署每一个组件,从而组成k8s集群。
kubeadm方式重在能够快快速部署,屏蔽了很多的内在细节;二进制包的方式需要了解每一个组件。
二、kubeadm方式搭建集群
(一)准备工作
- 硬件配置(2GB、2个CPU、30GB)
- 集群间网络互通
- 访问外网,拉取镜像
- 禁止swap分区
(二)准备环境
机器:
机器 | ip |
master | 192.168.35.3 |
node1 | 192.168.35.4 |
node2 | 192.168.35.5 |
在每一台机器上分别执行下面的步骤:
#1、 关闭防火墙 [root@localhost ~]# systemctl stop firewalld # 临时关闭 [root@localhost ~]# systemctl disable firewalld # 永久关闭 #2、 关闭selinux [root@localhost ~]# setenforce 0 # 临时关闭 [root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭 # 3、关闭swap [root@localhost ~]# swapoff -a #临时关闭 [root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭 #4、为每个节点设置主机名 [root@localhost ~]# hostnamectl set-hostname <hostname> # 例如master节点可以
hostnamectl set-hostname k8smaster #5、在master节点上添加hosts cat >> /etc/hosts << EOF 192.168.35.3 K8smaster 192.168.35.4 K8snode1 192.168.35.5 K8snode2 EOF #6、将桥接的IPv4流量传递到iptables的链 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 生效 #7、 时间同步 yum install ntpdate -y ntpdate time.windows.com
上述的步骤除了第5步是在master节点上执行,其余的步骤每一个节点都需要执行。
(三)所有节点安装Docker/kubeadm/kubelet
1、安装docker
[root@localhost ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo [root@localhost ~]# yum -y install docker-ce-18.06.1.ce-3.el7 [root@localhost ~]# systemctl enable docker && systemctl start docker [root@localhost ~]# docker --version Docker version 18.06.1-ce, build e68fc7a
镜像仓库设置:
[root@localhost ~]# cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } EOF
添加完毕后需要重启docker,使其生效。
2、添加阿里云yum源
[root@localhost ~]# 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
3、安装kubeadm、kubelet、kubectl
[root@localhost docker]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 [root@localhost docker]# systemctl enable kubelet
(四)部署k8s Master节点
1、拉取镜像
在master节点上执行:
[root@localhost ~]# kubeadm init --apiserver-advertise-address=192.168.35.3
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.18.0
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
其中-service-cidr和--pod-network-cidr的参数与现有ip不冲突即可。该过程会去registry.aliyuncs.com/google_containers镜像仓库拉取镜像:
[root@k8smaster ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-proxy v1.18.0 43940c34f24f 12 months ago 117MB registry.aliyuncs.com/google_containers/kube-scheduler v1.18.0 a31f78c7c8c 12 months ago 95.3MB ...
如果拉取成功后会出现这类的信息:
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 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ... Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.35.3:6443 --token xekg57.hpzba5xd67403jdq \ --discovery-token-ca-cert-hash sha256:14ed8f619508c2ae3c5fc59c324b17857f534bc3ebc20ad670391ab7115 ...
此时按照提示操作即可。
2、执行提示信息
master节点上执行上面红色部分:
[root@localhost ~]# mkdir -p $HOME/.kube [root@localhost ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@localhost ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
使用kubectl工具查看节点:
[root@localhost ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8smaster NotReady master 7m58s v1.18.0
3、加入node节点
红色字体的第二部分是加入node节点的方法,在每个node节点上分别执行:
[root@localhost docker]# kubeadm join 192.168.35.3:6443
--token xekg57.hpzba5xd67403jdq
--discovery-token-ca-cert-hash sha256:14ed8f619508c2ae3c5fc59c324b17857f534bc3ebc20ad670391ab7115069e2
默认token的有效期是24小时,当过期后token就不可用,此时需要重新创建token:
[root@k8smaster ~]# kubeadm token create --print-join-command W0418 20:52:05.750106 5988 configset.go:202] WARNING: kubeadm cannot validate component
configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.35.3:6443 --token sx3pqe.3g8f8vl06xr5381g
--discovery-token-ca-cert-hash sha256:14ed8f619508c2ae3c5fc59c324b17857f534bc3ebc20ad670391ab7115069e2
此时再查看加入的节点:
[root@k8smaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8smaster NotReady master 130m v1.18.0 k8snode1 NotReady <none> 115m v1.18.0 k8snode2 NotReady <none> 115m v1.18.0
可以看到STATUS的状态都是NotReady,这是不正确的,原因是缺少网络插件。
(五)部署CNI网络插件
在master节点上执行:
[root@k8smaster ~]# kubectl apply -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
通过下面的命令查看改网络组件状态:
[root@k8smaster ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE ... kube-flannel-ds-2ccgc 0/1 Running 0 5m1s kube-flannel-ds-lzlqn 1/1 Running 0 5m1s ...
此时在master节点上查看各节点情况。
[root@k8smaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8smaster Ready master 158m v1.18.0 k8snode1 Ready <none> 143m v1.18.0 k8snode2 Ready <none> 143m v1.18.0
(六)k8s集群测试
拉取nginx作为测试:
# 1、创建一个nginx pod [root@k8smaster ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created # 2、查看nginx pod状态,镜像下载完毕,并且运行 [root@k8smaster ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-f89759699-524pw 1/1 Running 0 68s # 3、对外暴漏端口 [root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed # 4、查看暴漏之后的情况,对外暴漏30901端口 [root@k8smaster ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-f89759699-524pw 1/1 Running 0 3m24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 167m service/nginx NodePort 10.101.153.209 <none> 80:30901/TCP 28s
此时如果访问各个节点的30901端口都可以访问到nginx就说明集群ok的。
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。