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
解決辦法:
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行日誌
這樣就可以訪問服務了