一、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的。