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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM