1. 程式人生 > >kubernetes 環境搭建 及 基礎架構介紹 及 一個進銷存管理系統 簡單搭建

kubernetes 環境搭建 及 基礎架構介紹 及 一個進銷存管理系統 簡單搭建

kubernetes是一個全新的基於容器技術的分散式架構領先方案。它是谷歌十幾年來大規模應用容器技術的經驗積累和昇華的一個重要成果

kubernetes是一個完備的分散式系統支撐平臺。kubernetes具有完備的叢集管理能力,包括多層次的安全防護和准入機制,多租戶應用支撐能力,透明的服務註冊和服務發現機制,內建智慧負載均衡器,強大的故障發現和自我修復能力,服務滾動升級和線上擴容能力,可擴充套件的資源自動排程機制,以及多粒度資源配額管理能力。同時,kubernetes提供了完善的管理工具,這些工具涵蓋了包括開發,部署測試,運維監控在內的各個環節。因此,kubernetes是一個全新的基於容器技術的分散式架構解決方案,並且是一個一站式的完備的分散式系統開發和支撐平臺

 

kubernetes安裝步驟

環境準備

master:192.168.255

slave :192.168.255

在 搭環境之前先關閉好 防火強 和 selinux

 

在master機器上

首先在master 用yum安裝 kubernetes 與 etcd

yum -y install kubernetes 目前 是 kubernetes-node-1.5.2-0.7.git269f928.el7.x86_64

yum -y install etcd 目前是3.2

 

配置檔案存放於/etc/kubernetes目錄中,其中config 檔案的內容為所有服務都需要的引數。與kube-apiserver相關的引數放置於apiserver中

 

修改 config檔案

配置檔案config 的內容包括: log設定,是否允許允許具有特權模式的docker容器及 master所在的地址等

vim /etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.255.128:8080"

 

修改配置檔案apiserver

配置檔案apiserver的內容包括:繫結主機的IP地址,埠號,etcd服務地址,Service所需的cluster ip池,一系列admission控制策略等

vim /etc/kubernetes/apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080"
# The port on the local server to listen on.
# KUBE_API_PORT="--port=8080"

# Port minions listen on
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""

 

在slave機器上

修改slave 配置 檔案kubelet

配置 檔案kubelet 的內容包括:繫結主機IP地址,埠號,apiserver的地址等等

vim /etc/kubernetes/kubelet

KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=linux-node2"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.255.128:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""

 

修改 config 配置檔案

vim /etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.255.128:8080"

 

 

然後在master 啟動 etcd , kube-apiserver.service kube-controller-manager.service kube-scheduler.service 服務

[[email protected] log]# systemctl start etcd

[[email protected] log]# systemctl start kube-apiserver.service

[[email protected] ~]# systemctl start kube-controller-manager.service

[[email protected] ~]# systemctl start kube-scheduler.service

 

在slave 啟動 kubelet, kube-proxy 服務

systemctl start kubelet

systemctl start kube-proxy

 

 

啟動完畢後 在 mater 上執行 kubectl get nodes 如果狀態顯示 Ready 就說明配置成功

NAME STATUS AGE

127.0.0.1 NotReady 25m

linux-node2 Ready 32s

 

如果 有錯誤,可以檢視 /var/log/message

 

kubernets 基礎架構

kubernets叢集分為兩類節點,分別是Master和Node, 在master執行 etcd,kube-apiserver,kube-controller-manager,kube-scheduler服務,其中

etcd 是一個key,value資料庫,用於持久化叢集中所有資源物件,如Service,RC等,apiserver提供了操作etcd的封裝介面API,以REST介面提供服務

這些服務基本上都是叢集中資源物件的CURD及監聽資源變化的介面,比如建立Pod,建立RC,監聽Pod的變化等,其中master 的 apiserver,controller-manager

,kube-scheduler 三個元件構成了kubernetes的總控制中心,負責對叢集中所有資源進行管控和排程

在每個Node上執行Kubelet,Proxy和Docker Daemon三個元件,負責對本節點上的Pod的生命週期進行管理,以及實現服務代理的功能,Kubelet是命令列的

工具,它提供了kubernetes的叢集管理工具集

其中 controller-manager:叢集內部的管理控制中心,其主要目的是實現kubernetes叢集的故障檢測和恢復的自動化工作,比如根據RC的定義完成pod的複製或移除,確保pod的數量與RC定義的數量相符,維護 服務 的 endpoints建立與刪除。node的自動發現,管理,狀態的監控等都是controller-manager的工作

kube-scheduler:在叢集中,負責pod節點的任務排程

proxy: service 與 pod間的代理,實現 service 與 pod間的軟體負載均衡

 

 

 

kubernetes 的 簡單使用

使用 kubernetes 執行一個 基於 spring boot 的 進銷存管理系統,關於進銷存映象的製作,請檢視我前面docker的文章

我們先定義RC來建立Pod,然後定義與之關聯的Service

 

首先建立要 RC

vim jxc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: jxc
  labels:
    name: jxc
spec:
  replicas: 1
  selector:
    name: jxc
  template:
    metadata:
      labels:
        name: jxc
    spec:
      containers:
      - name: jxc
        image: 192.168.255.128:5000/jxc:0.0.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

kind欄位的值為“ReplicationController”,表示這是一個RC。

spec.selector是RC的pod選擇器,即RC只監控和管理擁有這些標籤(Label)的pod例項

replicas=1 表示只能執行一個 名為jxc的 pod例項,當叢集中執行的pod數量小於replicas時,RC會根據spec.template

段定義的pod模板來生成一個新的pod例項

 

建立好yaml 檔案以後,我們在master節點執行命令 kubectl create -f jxc.yaml,將它釋出到kubernetes叢集中

 

kubectl get rc 檢視 叢集 執行的 rc

kubectl get pod 檢視當前叢集中的pod列表資訊

 

 

然後建立一個與之關聯的Service 資源服務

vim jxc-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: jxc
  labels:
    name: jxc
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: jxc

其中 metadata.name 是 service的服務名

spec.selector確定了哪些pod對應到本服務

type=NodePort並指定一個NodePort的值,表示使用Node上的物理機埠提供對外訪問的能力。spec.ports.NodePort

的埠號定義有範圍限制,預設為30000-32767,如果配置為範圍外的其他埠號,則建立Service將會失敗

 

kubectl create -f jxc-service.yaml,將它釋出到kubernetes

我們可以通過 kubectl get services 檢視 新增的 services是否建立成功

 

 

kubectl describe pods Pod_Name 檢視pod詳細資訊

kubectl describe rc jxc 檢視rc詳細資訊

 

刪除 指定檔案的所建立的資源

kubectl delete -f jxc.yaml

 

 

錯誤排錯

我們在 執行的

1 Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account

解決辦法:

修改apiserver檔案

vim /etc/kubernetes/apiserver

#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

 

 

2 image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be becaus

解決辦法

yum install *rhsm*

 

 

3 Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...

open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

解決辦法:

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

 

 

排查錯誤手段

docker logs -f a5778e9ab8d4 檢視docker 容器日誌進行排錯

kubectl describe rc jxc 檢視rc詳細資訊

docker logs -f -t --tail 10 s12 實時檢視docker容器名為s12的最後10行日誌

 

 

 

 

這樣就可以訪問服務了