基于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 鏡像并在容器裡運作)
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-tDJjJ89W-1579059294606)(/image/7bfd53be-aaf7-4aa4-82fc-f6c85fc38f30)]docker run hello-world
- 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
- docker 服務
- etcd服務
建立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的資訊
- 配置完成後即可啟動測試