純手工搭建k8s叢集-(2)核心模組部署
1. 部署ETCD(主節點)
1.1 簡介
需要儲存很多東西,像它本身的節點資訊,元件資訊,還有透過kubernetes執行的pod,deployment,service等等。都需要持久化。etcd就是它的資料中心。生產環境中為了保證資料中心的高可用和資料的一致性,一般會部署最少三個節點。我們這裡以學習為主就只在主節點部署一個例項。
如果你的環境已經有了etcd服務(不管是單點還是叢集),可以忽略這一步。前提是你在生成配置的時候填寫了自己的etcd endpoint哦~
1.2 部署
etcd的二進位制檔案和服務的配置我們都已經準備好,現在的目的就是把它做成系統服務並啟動。
#把服務配置檔案copy到系統服務目錄
$ cp ~/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/
#enable服務
$ systemctl enable etcd.service
#建立工作目錄(儲存資料的地方)
$ mkdir -p /var/lib/etcd
# 啟動服務
$ service etcd start
# 檢視服務日誌,看是否有錯誤資訊,確保服務正常
$ journalctl -f -u etcd.service
2. 部署(主節點)
2.1 簡介
kube-apiserver是Kubernetes最重要的核心元件之一,主要提供以下的功能
- 提供叢集管理的REST API介面,包括認證授權(我們現在沒有用到)資料校驗以及叢集狀態變更等
- 提供其他模組之間的資料互動和通訊的樞紐(其他模組透過API Server查詢或修改資料,只有API Server才直接操作etcd)
生產環境為了保證apiserver的高可用一般會部署2+個節點,在上層做一個lb做負載均衡,比如haproxy。由於單節點和多節點在apiserver這一層說來沒什麼區別,所以我們學習部署一個節點就足夠啦
2.2 部署
APIServer的部署方式也是透過系統服務。部署流程跟etcd完全一樣,不再註釋
$ cp target/master-node/kube-apiserver.service /lib/systemd/system/
$ systemctl enable kube-apiserver.service
$ service kube-apiserver start
$ journalctl -f -u kube-apiserver
2.3 重點配置說明
[Unit]
Description=Kubernetes API Server
…
[Service]
#可執行檔案的位置
ExecStart=/home/michael/bin/kube-apiserver
#非安全埠(8080)繫結的監聽地址 這裡表示監聽所有地址
–insecure-bind-address=0.0.0.0
#不使用https
–kubelet-https=false
#kubernetes叢集的虛擬ip的地址範圍
–service-cluster-ip-range=10.68.0.0/16
#service的nodeport的埠範圍限制
–service-node-port-range=20000-40000
#很多地方都需要和etcd打交道,也是唯一可以直接操作etcd的模組
–etcd-servers=http://192.168.1.102:2379
…
3. 部署ControllerManager(主節點)
3.1 簡介
Controller Manager由kube-controller-manager和cloud-controller-manager組成,是Kubernetes的大腦,它透過apiserver監控整個叢集的狀態,並確保叢集處於預期的工作狀態。
kube-controller-manager由一系列的控制器組成,像Replication Controller控制副本,Node Controller節點控制,Deployment Controller管理deployment等等
cloud-controller-manager在Kubernetes啟用Cloud Provider的時候才需要,用來配合雲服務提供商的控制
controller-manager、scheduler和apiserver 三者的功能緊密相關,一般執行在同一個機器上,我們可以把它們當做一個整體來看,所以保證了apiserver的高可用即是保證了三個模組的高可用。也可以同時啟動多個controller-manager程式,但只有一個會被選舉為leader提供服務。
3.2 部署
透過系統服務方式部署
$ cp target/master-node/kube-controller-manager.service /lib/systemd/system/
$ systemctl enable kube-controller-manager.service
$ service kube-controller-manager start
$ journalctl -f -u kube-controller-manager
3.3 重點配置說明
[Unit]
Description=Kubernetes Controller Manager
…
[Service]
ExecStart=/home/michael/bin/kube-controller-manager
#對外服務的監聽地址,這裡表示只有本機的程式可以訪問它
–address=127.0.0.1
#apiserver的url
–master=
#服務虛擬ip範圍,同apiserver的配置
–service-cluster-ip-range=10.68.0.0/16
#pod的ip地址範圍
–cluster-cidr=172.20.0.0/16
#下面兩個表示不使用證照,用空值覆蓋預設值
–cluster-signing-cert-file=
–cluster-signing-key-file=
…
4. 部署Scheduler(主節點)
4.1 簡介
kube-scheduler負責分配排程Pod到叢集內的節點上,它監聽kube-apiserver,查詢還未分配Node的Pod,然後根據排程策略為這些Pod分配節點。我們前面講到的kubernetes的各種排程策略就是它實現的。
4.2 部署
透過系統服務方式部署
$ cp target/master-node/kube-scheduler.service /lib/systemd/system/
$ systemctl enable kube-scheduler.service
$ service kube-scheduler start
$ journalctl -f -u kube-scheduler
4.3 重點配置說明
[Unit]
Description=Kubernetes Scheduler
…
[Service]
ExecStart=/home/michael/bin/kube-scheduler
#對外服務的監聽地址,這裡表示只有本機的程式可以訪問它
–address=127.0.0.1
#apiserver的url
–master=
…
5. 部署CalicoNode(所有節點)
5.1 簡介
Calico實現了CNI介面,是kubernetes網路方案的一種選擇,它一個純三層的資料中心網路方案(不需要Overlay),並且與OpenStack、Kubernetes、AWS、GCE等IaaS和容器平臺都有良好的整合。
Calico在每一個計算節點利用Linux Kernel實現了一個高效的vRouter來負責資料轉發,而每個vRouter透過BGP協議負責把自己上執行的workload的路由資訊像整個Calico網路內傳播——小規模部署可以直接互聯,大規模下可透過指定的BGP route reflector來完成。 這樣保證最終所有的workload之間的資料流量都是透過IP路由的方式完成互聯的。
5.2 部署
calico是透過系統服務+docker方式完成的
$ cp target/all-node/kube-calico.service /lib/systemd/system/
$ systemctl enable kube-calico.service
$ service kube-calico start
$ journalctl -f -u kube-calico
5.3 calico可用性驗證
檢視容器執行情況
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
4d371b58928b calico/node:v2.6.2 "start_runit" 3 hours ago...
檢視節點執行情況
$ calicoctl node status
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+---------------+-------------------+-------+----------+-------------+
| 192.168.1.103 | node-to-node mesh | up | 13:13:13 | Established |
+---------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
檢視埠BGP 協議是透過TCP 連線來建立鄰居的,因此可以用netstat 命令驗證 BGP Peer
$ netstat -natp|grep ESTABLISHED|grep 179
tcp 0 0 192.168.1.102:60959 192.168.1.103:179 ESTABLISHED 29680/bird
檢視叢集ippool情況
$ calicoctl get ipPool -o yaml
- apiVersion: v1
kind: ipPool
metadata:
cidr: 172.20.0.0/16
spec:
nat-outgoing: true
5.4 重點配置說明
[Unit]
Description=calico node
…
[Service]
#以docker方式執行
ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node
#指定etcd endpoints(這裡主要負責網路後設資料一致性,確保Calico網路狀態的準確性)
-e ETCD_ENDPOINTS=http://192.168.1.102:2379
#網路地址範圍(同上面ControllerManager)
-e CALICO_IPV4POOL_CIDR=172.20.0.0/16
#映象名,為了加快大家的下載速度,映象都放到了阿里雲上
6. 配置kubectl命令(任意節點)
6.1 簡介
kubectl是Kubernetes的命令列工具,是Kubernetes使用者和管理員必備的管理工具。
kubectl提供了大量的子命令,方便管理Kubernetes叢集中的各種功能。
6.2 初始化
使用kubectl的第一步是配置Kubernetes叢集以及認證方式,包括:
- cluster資訊:api-server地址
- 使用者資訊:使用者名稱、密碼或金鑰
- Context:cluster、使用者資訊以及Namespace的組合
我們這沒有安全相關的東西,只需要設定好api-server和上下文就好啦:
#指定apiserver地址(ip替換為你自己的api-server地址)
kubectl config set-cluster kubernetes --server=http://192.168.1.102:8080
#指定設定上下文,指定cluster
kubectl config set-context kubernetes --cluster=kubernetes
#選擇預設的上下文
kubectl config use-context kubernetes
透過上面的設定最終目的是生成了一個配置檔案:~/.kube/config,當然你也可以手寫或複製一個檔案放在那,就不需要上面的命令了。
7. 配置kubelet(工作節點)
7.1 簡介
每個工作節點上都執行一個kubelet服務程式,預設監聽10250埠,接收並執行master發來的指令,管理Pod及Pod中的容器。每個kubelet程式會在API Server上註冊節點自身資訊,定期向master節點彙報節點的資源使用情況,並透過cAdvisor監控節點和容器的資源。
7.2 部署
透過系統服務方式部署,但步驟會多一些,具體如下:
#確保相關目錄存在
$ mkdir -p /var/lib/kubelet
$ mkdir -p /etc/kubernetes
$ mkdir -p /etc/cni/net.d
#複製kubelet服務配置檔案
$ cp target/worker-node/kubelet.service /lib/systemd/system/
#複製kubelet依賴的配置檔案
$ cp target/worker-node/kubelet.kubeconfig /etc/kubernetes/
#複製kubelet用到的cni外掛配置檔案
$ cp target/worker-node/10-calico.conf /etc/cni/net.d/
$ systemctl enable kubelet.service
$ service kubelet start
$ journalctl -f -u kubelet
7.3 重點配置說明
kubelet.service
[Unit]
Description=Kubernetes Kubelet
[Service]
#kubelet工作目錄,儲存當前節點容器,pod等資訊
WorkingDirectory=/var/lib/kubelet
ExecStart=/home/michael/bin/kubelet
#對外服務的監聽地址
–address=192.168.1.103
#指定基礎容器的映象,負責建立Pod 內部共享的網路、檔案系統等,這個基礎容器非常重要:K8S每一個執行的 POD裡面必然包含這個基礎容器,如果它沒有執行起來那麼你的POD 肯定建立不了
–pod-infra-container-image=
#訪問叢集方式的配置,如api-server地址等
–kubeconfig=/etc/kubernetes/kubelet.kubeconfig
#宣告cni網路外掛
–network-plugin=cni
#cni網路配置目錄,kubelet會讀取該目錄下得網路配置
–cni-conf-dir=/etc/cni/net.d
#指定 kubedns 的 Service IP(可以先分配,後續建立 kubedns 服務時指定該 IP),–cluster-domain 指定域名字尾,這兩個引數同時指定後才會生效
–cluster-dns=10.68.0.2
…
kubelet.kubeconfig
kubelet依賴的一個配置,格式看也是我們後面經常遇到的yaml格式,描述了kubelet訪問apiserver的方式
apiVersion: v1
clusters:
- cluster:
#跳過tls,即是kubernetes的認證
insecure-skip-tls-verify: true
#api-server地址
server: http://192.168.1.102:8080
…
10-calico.conf
calico作為kubernets的CNI外掛的配置
{
"name": "calico-k8s-network",
"cniVersion": "0.1.0",
"type": "calico",
<!--etcd的url-->
"ed_endpoints": "http://192.168.1.102:2379",
"logevel": "info",
"ipam": {
"type": "calico-ipam"
},
"kubernetes": {
<!--api-server的url-->
"k8s_api_root": "http://192.168.1.102:8080"
}
}
8. 小試牛刀
到這裡最基礎的kubernetes叢集就可以工作了。下面我們就來試試看怎麼去操作,控制它。
我們從最簡單的命令開始,嘗試一下kubernetes官方的入門教學:playground的內容。瞭解如何建立pod,deployments,以及檢視他們的資訊,深入理解他們的關係。
具體內容請看慕課網的影片吧:
9. 為叢集增加service功能 - kube-proxy(工作節點)
9.1 簡介
每臺工作節點上都應該執行一個kube-proxy服務,它監聽API server中service和endpoint的變化情況,並透過iptables等來為服務配置負載均衡,是讓我們的服務在叢集外可以被訪問到的重要方式。
9.2 部署
透過系統服務方式部署:
#確保工作目錄存在
$ mkdir -p /var/lib/kube-proxy
#複製kube-proxy服務配置檔案
$ cp target/worker-node/kube-proxy.service /lib/systemd/system/
#複製kube-proxy依賴的配置檔案
$ cp target/worker-node/kube-proxy.kubeconfig /etc/kubernetes/
$ systemctl enable kube-proxy.service
$ service kube-proxy start
$ journalctl -f -u kube-proxy
9.3 重點配置說明
kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
…
[Service]
#工作目錄
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/home/michael/bin/kube-proxy
#監聽地址
–bind-address=192.168.1.103
#依賴的配置檔案,描述了kube-proxy如何訪問api-server
–kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig
…
kube-proxy.kubeconfig
配置了kube-proxy如何訪問api-server,內容與kubelet雷同,不再贅述。
10. 為叢集增加dns功能 - kube-dns(app)
10.1 簡介
kube-dns為Kubernetes叢集提供命名服務,主要用來解析叢集服務名和Pod的hostname。目的是讓pod可以透過名字訪問到叢集內服務。它透過新增A記錄的方式實現名字和service的解析。普通的service會解析到service-ip。headless service會解析到pod列表。
10.2 部署
透過應用的方式部署
kube-dns.yaml檔案基本與官方一致(除了映象名不同外)。
裡面配置了多個元件,之間使用”—“分隔
#到kubernetes-starter目錄執行命令
$ kubectl create -f target/services/kube-dns.yaml
10.3 重點配置說明
請直接參考配置檔案中的註釋。
l
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2799883/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kubeadm部署K8S叢集K8S
- Ansible部署K8s叢集K8S
- 教你如何搭建K8S叢集。K8S
- k8s——搭建叢集環境K8S
- kubeadm部署k8s1.9高可用叢集–2搭建etcd叢集K8S
- k8s 部署生產vault叢集K8S
- Redis-cluster叢集搭建部署Redis
- 基於Ubuntu部署企業級kubernetes叢集---k8s叢集容部署UbuntuK8S
- 在K8S上搭建Redis叢集K8SRedis
- Kubeadm方式搭建K8S叢集K8S
- k8s叢集搭建--kubeadm方式K8S
- K8S如何部署Redis(單機、叢集)K8SRedis
- Mac + Docker + K8S 本地搭建K8S叢集MacDockerK8S
- 簡單的方式搭建k8s叢集K8S
- 高階k8s HA 叢集搭建(一)K8S
- 使用kind快速搭建本地k8s叢集K8S
- 從零搭建K8S測試叢集K8S
- 通過kubeadm工具部署k8s叢集K8S
- 【k8s】使用Terraform一鍵部署EKS叢集K8SORM
- 基於kubeasz部署高可用k8s叢集K8S
- AnolisOS7.9部署K8s叢集K8S
- 升級 kubeadm 部署的 k8s 叢集K8S
- Jstorm叢集搭建過程/Jstorm叢集一鍵安裝部署JSORM
- 2019最新k8s叢集搭建教程 (centos k8s 搭建)K8SCentOS
- 教你用multipass快速搭建k8s叢集K8S
- k8s搭建叢集軟硬體配置要求K8S
- Rancher 下圖形介面 搭建 K8S 叢集K8S
- 欠你們的 → k8s 叢集搭建,除夕奉上!K8S
- k8s介紹及與docker搭建叢集K8SDocker
- redis 叢集搭建以及redislive監測部署Redis
- 搭建zookeeper叢集(偽叢集)
- 日誌分析系統 - k8s部署ElasticSearch叢集K8SElasticsearch
- Kubernetes(k8s)部署redis-cluster叢集K8SRedis
- Apache SeaTunnel k8s 叢集模式 Zeta 引擎部署指南ApacheK8S模式
- 叢集搭建
- 部署分片叢集
- zookeeper叢集及kafka叢集搭建Kafka
- SpringCloud微服務實戰——搭建企業級開發框架(三十五):SpringCloud + Docker + k8s實現微服務叢集打包部署-叢集環境部署SpringGCCloud微服務框架DockerK8S