天天看點

基于Kubernetes單機安裝、部署SpringBoot、叢集部署

基于Kubernetes單機安裝、部署SpringBoot、叢集部署

基于Kubernetes單機安裝、部署SpringBoot

kubernetes是容器編排器,單機二進制檔案方式安裝、離線安裝版本及環境

  • Centos7
  • kubernetes 1.13版
  • docker 18.09.3版
準備階段
  • 禁用防火牆
systemctl stop firewalld
systemctl disable firewalld
           
  • 禁用SELinux(影響docker的使用)
# 打開selinux檔案
vi /etc/sysconfig/selinux

# 修改SELINUX
SELINUX=disabled
           
  • 關閉swap記憶體
swapoff -a
           
k8s的安裝
  • 下載下傳kubernetes(簡稱K8S)二進制檔案 https://github.com/kubernetes/kubernetes/releases
    基于Kubernetes單機安裝、部署SpringBoot、叢集部署
  • 元件選擇:選擇Service Binaries中的 kubernetes-server-linux-amd64.tar.gz 該檔案已經包含了 K8S所需要的全部元件,無需單獨下載下傳Client等元件
    基于Kubernetes單機安裝、部署SpringBoot、叢集部署
安裝規劃
  • 解壓壓縮包,将二進制檔案(etcd、etcdctl、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kubectl、kube-proxy)複制到/usr/bin目錄下
  • Master 服務
    • etcd服務
      • etcd服務是作為kubernetes叢集的主資料庫,在安裝kubernetes各服務之前需要首先安裝和啟動
      • 設定 systemd 服務檔案 /usr/lib/systemd/system/etcd.service
        • WorkingDirectory(/var/lib/etcd)表示etcd資料儲存的目錄,需要在啟動etcd服務之前進行建立
      [Unit]
      Description=etcd.service
      After=network.target
      
      
      [Service]
      Type=simple
      #TimeoutStartSec=0
      #Restart=always
      WorkingDirectory=/var/lib/etcd
      EnvironmentFile=-/etc/etcd/etcd.conf
      ExecStart=/usr/bin/etcd
      
      
      [Install]
      WantedBy=multi-user.target
                 
      • 配置檔案 /etc/etcd/etcd.conf ,etcd預設将監聽在 http://127.0.0.1:2379 位址供客戶連接配接
      ETCD_NAME=ETCD ServerETCD_DATA_DIR="/var/lib/etcd/"ETCD_LISTEN_CLIENT_URLS = "http://127.0.0.1:2379"ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:23
                 
      • 配置完成,通過 systemctl staart 指令啟動 etcd 服務;可以使用 systemctl enable 指令将服務加入開機啟動清單中
      systemctl daemon-reload
      systemctl enable etcd.service
      systemctl start etcd.service
                 
      • 通過執行 etcdctl cluster-health,可以驗證 etcd 是否正确啟動
      [[email protected] system]# etcdctl cluster-health
      member 8e9e05c52164694d is healthy: got healthy result from http://127.0.0.1:2379cluster is healthy
                 
    • kube-apiserver服務
      • kube-apiserver服務提供了 HTTP Rest 接口的關鍵服務程序,是 Kubernetes 裡所有資源的增、删、改、查等操作的唯一入口,也是叢集控制的入口程序
      • 編輯 systemd 服務檔案 /usr/lib/systemd/system/kube-apiserver.service
      [Unit]
      Description=Kubernetes API Server
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=etcd.service
      Wants=etcd.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/apiserver
      ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
      Restart=on-failure
      Type=notify
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
                 
      • 配置檔案 /etc/kubernetes/apiserver 内容包含了 kube-apiserver 的全部啟動參數,主要的配置參數在變量 KUBE_API_ARGS 中指定
        • –admission-control 中的 ServiceAccount 暫時不設,該參數是 Servjce 令牌校驗,暫時不使用;會影響 kubelet 啟動 svc
      • 啟動參數說明
        • –etcd-servers:指定 etcd 服務的 URL
        • –storage-backend:指定 etcd的版本,從 kubernetes v1.6開始,預設為 etcd3;kubernetes v1.6以前沒有此參數,kube-apiserver預設使用etcd2
        • –insecure-bind-apiserver:綁定主機的非安全 IP 位址,設定 0.0.0.0 表示綁定所有 IP
        • –insecure-port:apiserver綁定主句的非安全 IP 位址,預設為 8080
        • –service-cluster-ip-range:kubernetes叢集中 Service 的虛拟 IP 位址段範圍,以 CIDR 是表示,例如 169.169.0.0/16,該 IP 範圍不能與實體機的真實 IP 段有重合
        • –service-node-port-range:kubernetes叢集中 Service 可映射的實體機端口号範圍,預設 30000~32767
        • –admission-control:kubernetes 叢集的準入控制設定,各控制子產品以插件的形式依次生效
        • –logtostderr:設定為 false 表示将日志寫入檔案,不寫入stderr
        • –log-dir:日志目錄

          —v:日志級别

    • kube-controller-manager服務
      • kube-controller-manager服務是 kubernetes 中所有資源對象的自動化控制中心
      • kube-controller-manager 服務依賴于 kube-apiserver 服務
      • 編輯 systemd 服務檔案 /usr/lib/systemd/system/kube-controller-manager.service;
      [Unit]
      Description=Kubernetes Controller Manager
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=kube-apiserver.service
      Requires=kube-apiserver.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/controller-manager
      ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
      Restart=on-failure
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
                 
      • 配置檔案 /etc/kubernetes/controller-manager 内容包含了 kube-controller-manager 的全部啟動參數,主要的配置參數在變量 KUBE_APICONTROLLER_MANAGER_ARGS 中指定
      • 啟動參數說明
        • –master:指定 apiserver 的URL位址
        • –logtostderr:設定為 false 表示将日志寫入檔案,不寫入 stderr
        • –log-dir:日志目錄
        • –v:日志級别
    • kube-scheduler服務
      • kube-scheduler 服務負責資源排程(Pod排程)的程序
      • kube-scheduler 服務依賴于 kube-apiserver 服務
      • 編輯 systemd 服務檔案 /usr/lib/systemd/system/kube-scheduler.service;
      [Unit]
      Description=Kubernetes Scheduler
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=kube-apiserver.service
      Requires=kube-apiserver.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/scheduler
      ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
      Restart=on-failure
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
                 
      • 配置檔案 /etc/kubernetes/scheduler 内容包含了 kube-scheduler 的全部啟動參數,主要的配置參數在變量 KUBE_SCHEDULER_ARGS 中指定
      • 啟動參數說明
        • –master:指定 apiserver 的URL位址
        • –logtostderr:設定為 false 表示将日志寫入檔案,不寫入 stderr

          —log-dir:日志目錄

        • –v:日志級别

          *- 配置完成後,執行 systemctl start 指令按順序啟動 kube-apiserver、kube-controller-manager、kube-scheduler 這三個服務,可使用 systemctl enable 指令将服務加入開機啟動清單

      systemctl daemon-reload
      systemctl enable kube-apiserver
      systemctl start kube-apiserver
      systemctl enable kube-controller-manager
      systemctl start kube-controller-manager
      systemctl enable kube-scheduler
      systemctl start kube-scheduler
                 
      • 通過 systemctl status <service_name> 來驗證服務的啟動狀态,“running”表示啟動成功,以上是 Master 所需的服務
    • Node 服務
      • docker 服務
        • docker 是一個開源的應用容器引擎,基于 Go語言 并遵從 Apache2.0 協定開源;可以讓開發者打包應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器中,也可以以實作虛拟化
        • 移除舊版本
        sudo yum remove docker \
        				docker-client \
        				docker-client-latest \
        				docker-common \
        				docker-latest \
        				docker-latest-logrotate \
        				docker-logrotate \
        				docker-selinux \
        				docker-engine-selinux \
        				docker-engine
                   
        • 安裝必要系統工具
        sudo yum install -y yum-utils device-mapper-persistent-data lvm2
                   
        • 添加軟體源資訊
        sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
                   
        • 更新 yum 緩存
        sudo yum makecache fast
                   
        • 安裝 Docker-ce
        sudo yum -y install docker-ce
                   
        • 鏡像加速,在 /etc/docker 下找到 daemon.json 檔案(沒有自行建立)添加鏡像加速位址
        {
          "registry-mirrors": [ "https://registry.docker-cn.com"]
        }
                   
        • 啟動 Docker 背景服務
        sudo systemctl start docker
                   
        • 測試運作 hello-world(本地沒有 hello-world 鏡像,docker會下載下傳一個 hello-world 鏡像并在容器裡運作)
        docker run hello-world
                   
        [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-tDJjJ89W-1579059294606)(/image/7bfd53be-aaf7-4aa4-82fc-f6c85fc38f30)]
      • kubelet 服務
        • kubelet 服務負責 Pod 對應的容器的建立、啟停等任務,同時與 Master 節點密切協定,實作叢集管理的基本功能
        • kubelet 服務依賴于 Docker 服務
        • 設定 systemd 服務檔案 /usr/lib/systemd/system/kubelet.service
          • WorkingDirectory(/var/lib/kubelet)表示 kubelet 儲存資料的目錄,需要在啟動 kubelet 服務之前進行建立
        [Unit]
        Description=Kubernetes Kubelet Server
        Documentation=https://github.com/GoogleCloudPlatform/kubernetes
        After=docker.service
        Requires=docker.service
        
        
        [Service]
        WorkingDirectory=/var/lib/kubelet
        EnvironmentFile=/etc/kubernetes/kubelet
        ExecStart=/usr/bin/kubelet $KUBELET_ARGS
        Restart=on-failure
        
        
        [Install]
        WantedBy=multi-user.target
                   
        • 配置檔案 /etc/kubernetes/kubelet 内容包含了 kubelet 的全部啟動參數,主要的配置參數在變量 KUBELET_ARGS 中指定
        • 配置 kubelet.kubeconfig 檔案
        apiVersion: v1
        kind: Config
        clusters:
          - cluster:
        	  server: http://0.0.0.0:8080/
        	name: local
        contexts:
          - context:
        	  cluster: local
        	name: local
        current-context: local
                   
      • kube-proxy 服務
        • kube-proxy 服務實作 kubernetes service 的通信與負載均衡機制的重要元件
        • kubelet 服務依賴于 network 服務
        • 設定 systemd 服務檔案 /usr/lib/systemd/system/kube-proxy.service
        [Unit]
        Description=Kubernetes Kube-Proxy Server
        Documentation=https://github.com/kubernetes/kubernetes
        After=network.target
        
        
        [Service]
        EnvironmentFile=/etc/kubernetes/proxy
        ExecStart=/usr/bin/kube-proxy $KUBE_ARGS
        Restart=on-failure
        LimitNOFILE=65536
        
        
        [Install]
        WantedBy=multi-user.target
                   
        • 配置檔案 /etc/kubernetes/kube-proxy 内容包含了 kube-proxy 的全部啟動參數,主要的配置參數在變量 KUBE_PROXY_ARGS 中指定
      • 配置完成後,通過 systemctl 啟動 kubelet 和 kube-proxy 服務
      systemctl daemon-reload
      systemctl enable kubelet
      systemctl start kubelet
      systemctl enable kube-proxy
      systemctl start kube-proxy
                 
      • kubelet 預設采用向 Master 自動注冊本 Node 的機制,在 Master 上檢視各 Node 的狀态,狀态為 Ready 表示 Node 已經成功注冊并狀态為可用
      [[email protected] kubernetes]# kubectl get nodes
      NAME                         STATUS     ROLES    AGE     VERSION
      0.0.0.0                      Ready      <none>   5d22h   v1.13.0-beta.2
      china-f18247202.ygsoft.com   NotReady   <none>   5d23h   v1.13.0-beta.2
                 
建立Pod、Service資源對象來部署Docker容器應用
  • 建立Spring Boot項目,編寫一個 Restful 接口
@RestController
public class HelloController {
     @GetMapping("/hello")
     public String hello() {
          return "Hello Docker World";
     }
}
           
  • 在Eclipse中選中項目右鍵,選擇Run As,然後選擇Maven build …,使用 clean install -X 進行打包

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-xF9WGGQA-1579059294607)(/image/8109f6d4-e274-4911-82cf-9453ce9bacc7)]

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-BTjlH841-1579059294607)(/image/83f94b48-9762-4866-8020-02c2f6387d72)]

  • 将打好的 jar 包上傳至伺服器;使用 docker build -t dome . 指令以 Dockerfile 檔案将上傳的 jar 包建構 Docker 本地鏡像;建構完成使用 docker images 指令檢視鏡像清單
[[email protected] docker]# cat Dockerfile
FROM openjdk:8-jre-alpine
ENV APP_FILE hello-0.0.1-SNAPSHOT.jar
ENV APP_HOME /data/docker
EXPOSE 8088
COPY $APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
[[email protected] docker]# docker build -t dome .
...
[[email protected] docker]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
demo                               latest              76226bf7e611        30 hours ago        102MB
openjdk                            8-jre-alpine        1b46cc2ba839        5 weeks ago         85MB
ansible/centos7-ansible            latest              688353a31fde        2 years ago         447MB
hub.c.163.com/k8s163/pause-amd64   3.0                 99e59f495ffa        2 years ago         747kB
           
  • 編輯 demo-pod.yaml、demo-svc.yaml 檔案,
[[email protected] docker]# cat demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
  app: demo
spec:
  name:
  containers:
  - name: demo
    #鏡像名
    image: demo
    #本地有鏡像就不會去倉庫拉取
    imagePullPolicy: Never
    ports:
      - containerPort: 8088
[[email protected] docker]# cat demo-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: demo
labels:
  app: demo
spec:
  type: NodePort
  ports:
  - port: 8088
    targetPort: 8088
    nodePort: 30001
  selector:
   app: demo
           
  • 建立 pod、svc;檢視建立狀态及詳情
[[email protected] docker]# kubectl create -f demo-pod.yaml
...
[[email protected] docker]# kubectl get po
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          26h
[[email protected] docker]# kubectl describe pod demo
Name:         demo
Namespace:    default
Node:         0.0.0.0/0.0.0.0
Start Time:   Wed, 13 Mar 2019 12:00:25 +0800
Labels:       app=demo
Annotations:  <none>
Status:       Running
IP:           172.17.0.2
Containers:
  demo:
    Container ID:   docker://2c4385425e2131789e31d39eff3e5322c4ae68cef32b290f8bb9f9e391ddc959
    Image:          demo
    Image ID:       docker://sha256:76226bf7e61106f28c3e481480b74986aa305b348f61b588528055c75b2d9ac9
    Port:           8088/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 13 Mar 2019 12:00:28 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:         <none>
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:            <none>
QoS Class:          BestEffort
Node-Selectors:     <none>
Tolerations:        node.kubernetes.io/not-ready:NoExecute for 300s
                    node.kubernetes.io/unreachable:NoExecute for 300s
Events:             <none>

[[email protected] docker]# kubectl create -f demo-svc.yaml
...
[[email protected] docker]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
demo         NodePort    127.0.64.29   <none>        8088:30001/TCP   26h
kubernetes   ClusterIP   127.0.0.1     <none>        443/TCP          9d
[[email protected] docker]# kubectl describe svc demo
Name:                     demo
Namespace:                default
Labels:                   app=demo
Annotations:              <none>
Selector:                 app=demo
Type:                     NodePort
IP:                       127.0.64.29
Port:                     <unset>  8088/TCP
TargetPort:               8088/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                172.17.0.2:8088
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
           
  • 執行 curl ip:port 指令檢視部署是否成功
[[email protected] docker]# curl 172.17.0.2:8088/hello
Hello Docker World
           

叢集部署

準備階段
  • 禁用防火牆
systemctl stop firewalld
systemctl disable firewalld
           
  • 禁用SELinux(影響docker的使用)
# 打開selinux檔案
vi /etc/sysconfig/selinux

# 修改SELINUX
SELINUX=disabled
           
  • 關閉swap記憶體
swapoff -a
           
叢集部署
  • 主節點部署跟單機部署方式一緻,無需任何改變
  • 從節點部署修改部分
    • 配置檔案 /etc/kubernetes/kubelet 修改hostname-override、address該為節點IP
    • 配置kubelet.kubeconfig檔案,修改clusters.cluster.server的IP為節點IP
    apiVersion: v1
    kind: Config
    clusters:
      - cluster:
          server: http://10.121.55.46:8080/
      name: local
    contexts:
      - context:
          cluster: local
        name: local
    current-context: local
               
    • 配置檔案 /etc/kubernetes/kube-proxy 修改master、bind-address、host-override、cluster-cidr的資訊
  • 配置完成後即可啟動測試

繼續閱讀