微服務架構 - 離線部署k8s平台並部署測試實例


一般在公司部署或者真實環境部署k8s平台,很有可能是內網環境,也即意味着是無法連接互聯網的環境,這時就需要離線部署k8s平台。在此整理離線部署k8s的步驟,分享給大家,有什么不足之處,歡迎指正。

1、准備環境

這次離線部署k8s的版本為v1.10.1,同時docker的版本為17.12.0-ce,不過本文章不介紹如何離線部署docker,如果大家要看的話,可以看本人之前寫的文章CentOS7離線部署docker

本人准備的環境是3台虛擬機,也即1台master節點,2個node節點,ip及配置如下:

主機名 IP 內存
k8s-master 192.168.197.131 2G
k8s-node-1 192.168.197.132 1G
k8s-node-2 192.168.197.133 1G

2、設置環境

(1)、所有節點關閉防火牆,操作命令如下:

systemctl stop firewalld
systemctl disable firewalld

(2)、所有節點關閉selinux,操作命令如下:

setenforce 0

同時編輯/etc/selinux/config,使其中SELINUX=disabled

(3)、所有節點關閉swap,操作命令如下:

swapoff -a

同時編輯/etc/fstab,注釋掉含有swap的這一行

(4)、所有節點設置系統參數,操作如下命令:

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

3、安裝kubeadm、kubelet、kubectl

相關的rpm安裝包,已經提前下載好了,需要如下文件:

在每個節點都安裝這些rpm安裝包,安裝命令如下:

rpm -ivh *.rpm

設置Cgroup Driver,由於kubelet的Cgroup Driver為systemd,而docker的Cgroup Driver信息可以通過:

docker info

返回的信息為:

可以發現docker的Cgroup Driver為cgroupfs,為此將kubelet的Cgroup Driver修改為cgroupfs,即修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,將其中的cgroup-driver=systemd改為cgroupfs

注意:所有節點kubelet的Cgroup Driver都要修改為cgroupfs

所有節點重設kubelet服務,並重啟kubelet服務,同時設置為開機自啟動,即:

systemctl daemon-reload && systemctl restart kubelet
systemctl enable kubelet

4、准備鏡像

相關要用到的鏡像,已經提前下載好了(文章最后會提供下載所有安裝文件的地址),只需要用docker load命令將鏡像導入即可,注意所有的節點都需要導入這些鏡像, 鏡像列表如下:

5、部署master節點

通過kubeadm初始化master節點,在master節點上執行:

kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.197.131

由於在此網絡配置采用flannel,所以--pod-network-cidr設置為10.244.0.0/16

該命令執行完后,如果看到如下結果,則表示初始化成功,即:

Your Kubernetes master 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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e

則需要按照提示,執行如下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

同時將其它node節點加入k8s集群命令記好,等下后面需要用到的。

緊接着在master節點部署網絡插件flannel,這時可以通過kubectl命令來安裝,即:

kubectl apply -f kube-flannel.yml

注意:kube-flannel.yml文件,可以在https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml獲取到,當然文章最后提供的安裝包里面也有該文件的。

此時可以查看master的狀態,即輸入如下命令:

kubectl get nodes

結果為:

可見看到master的狀態為Ready,即表明master節點部署成功!

6、加入node節點

加入node節點的操作就很簡單了,只需要將上面初始化master節點成功后返回的join命令,在所有node節點上執行即可,即:

kubeadm join 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e

如果這個join命令忘記保存,可以在master節點執行如下命令獲取join命令的:

kubeadm token create --print-join-command

所有的node節點都加入后,可以在master節點執行命令查看各個節點的狀態,即:

kubectl get nodes

結果為:

由上可知所有節點的狀態都Ready,說明部署成功了!

也可查看一下所有pod的狀態,即執行:

kubectl get pods --all-namespaces

結果為:

7、自定義證書並部署dashboard

在master節點的/root/k8s/ssl目錄下制作證書:

(1)、生成私鑰:

openssl genrsa -out ca.key 2048

(2)、生成自簽名證書:

openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=CA"

(3)、生成dashboard私鑰:

openssl genrsa -out dashboard.key 2048

(4)、申請簽名請求:

openssl req -new -sha256 -key dashboard.key -out dashboard.csr -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=192.168.197.131"

(5)、創建配置文件dashboard.cnf ,內容如下:

extensions = san
[san]
keyUsage = digitalSignature
extendedKeyUsage = clientAuth,serverAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = IP:192.168.197.131,IP:127.0.0.1,DNS:192.168.197.131,DNS:localhost,DNS:k8s-master

(6)、簽發證書:

openssl x509 -req -sha256 -days 3650 -in dashboard.csr -out dashboard.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extfile dashboard.cnf

(7)、將證書信息放到secret中:

kubectl create secret generic kubernetes-dashboard-certs --from-file="dashboard.crt,dashboard.key" -n kube-system 

(8)、安裝kubernetes-dashboard.yml,即執行:

kubectl apply -f kubernetes-dashboard.yml

其中kubernetes-dashboard.yml文件文章最后的安裝包里面會提供。

(9)、設置dashboard的admin權利:

由於kubernetes-dashboard綁定的角色為kubernetes-dashboard-minimal,為了提供admin權限則需要執行:

kubectl apply -f kubernetes-dashboard-rbac-admin.yml

其中 kubernetes-dashboard-rbac-admin.yml文件文章最后的安裝包里面會提供。

(10)、查看pod、svc狀態

輸入kubectl get pods --all-namespaces,可以看到有這么一條信息:

kube-system   kubernetes-dashboard-7d5dcdb6d9-nszwk   1/1       Running   1

輸入kubectl get svc -n kube-system,可以看到有這么一條信息:

kubernetes-dashboard   NodePort    10.107.115.153   <none>        443:31195/TCP

此根據NodePort模式下,對外訪問dashboard的端口為31195,即:在瀏覽器中輸入:

https://192.168.197.131:31195

注意是https協議。

可看到如下頁面:

可以通過令牌的訪問方式進入,即首先得獲取令牌信息:

(1)、首先得到kubernetes-dashboard-admin的secret記錄,即:

kubectl get secret --all-namespaces | grep kubernetes-dashboard-admin

得到的結果為:

kube-system   kubernetes-dashboard-admin-token-75pdg           kubernetes.io/service-account-token   3

(2)、獲取token值,即通過上面secret結果,然后執行如:

kubectl describe secret kubernetes-dashboard-admin-token-75pdg -n kube-system

得到的結果為:

這個token值輸入到瀏覽器中令牌所需要的內容即可以登錄,即:

8、部署自定義測試實例

本人通過SpringBoot寫了一個簡單的工程,只有一個測試方法,即:

package com.swnote.k8s.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 測試類
 * 
 * @author lzj
 * @date [2019-03-16]
 */
@RestController
public class TestController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "架構與我,歡迎關注!";
    }
}

然后將本工程打成jar包,然后通過Dockerfile文件打成鏡像,Dockerfile文件如下:

FROM java:8
VOLUME /tmp
ADD k8s-jgyw-1.0.jar app.jar
#RUN bash -c 'touch /app.jar'
EXPOSE 80
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

執行打鏡像的命令:

docker build -t k8s-jgyw:1.0 .

注意所有的節點都需要k8s-jgyw:1.0鏡像,然后部署該實例k8s-jgyw.yml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jgyw
  labels:
    app: k8s-jgyw
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-jgyw
  template:
    metadata:
      labels:
        app: k8s-jgyw
    spec:
      containers:
        - name: jgyw
          image: k8s-jgyw:1.0
          ports:
            - containerPort: 80
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: jgyw
  labels:
    app: k8s-jgyw
spec:
  type: NodePort
  selector:
    app: k8s-jgyw
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

執行部署命令:

kubectl apply -f k8s-jgyw.yml

然后svc信息,獲取對外訪問的端口,即:

kubectl get svc

返回結果為:

jgyw         NodePort    10.97.250.52   <none>        80:32461/TCP

則通過瀏覽器訪問如下地址:

http://192.168.197.131:32461

結果如下:

說明測試實例部署成功了!

9、安裝包下載地址

安裝包的下載為https://pan.baidu.com/s/1r0OkljXdmXx37h9aHDLDDg,提取碼為:m11n

關注我

以你最方便的方式關注我:
微信公眾號:


免責聲明!

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



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