Fork me on GitHub

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

 

posted @ 2021-04-18 21:59  iveBoy  阅读(3574)  评论(5编辑  收藏  举报
TOP