k8s1.9.0安裝--基礎集群部署


二、基礎集群部署 - kubernetes-simple

1. 部署ETCD(主節點)

1.1 簡介

kubernetes需要存儲很多東西,像它本身的節點信息,組件信息,還有通過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

$ etcdctl -C http://10.0.94.112:2379 cluster-health 
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.94.112:2379 
cluster is healthy

2. 部署APIServer(主節點)

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
$ systemctl daemon-reload
$ 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=http://127.0.0.1:8080\
#服務虛擬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=http://127.0.0.1:8080\
...

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 \
#鏡像名,為了加快大家的下載速度,鏡像都放到了阿里雲上
registry.cn-hangzhou.aliyuncs.com/imooc/calico-node:v2.6.2

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://10.0.94.112: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=registry.cn-hangzhou.aliyuncs.com/imooc/pause-amd64:3.0 \
#訪問集群方式的配置,如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-->

    "etcd_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,以及查看他們的信息,深入理解他們的關系。

#常用命令
  237  kubectl version
  238  kubectl get nodes
  239  kubectl get --help
  241  kubectl run kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1 --port=8080
  242  kubectl get deployments
  243  kubectl get pods
  244  kubectl get pods -o wide
  245  docker ps
  246  kubectl get deployments
  248  kubectl delete deployments kubernetes-bootcamp
  250  kubectl run kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1 --port=8080
  255  docker ps
  256  journalctl -f
  259  kubectl describe deploy kubernetes-bootcamp
  260  kubectl proxy
  262  kubectl scale deploy kubernetes-bootcamp --replicas=4
  266  kubectl scale deploy kubernetes-bootcamp --replicas=2
  269  kubectl describe deploy
  272  kubectl set image deploy kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
  274  kubectl rollout status deploy kubernetes-bootcamp
  277  kubectl rollout undo deploy kubernetes-bootcamp

  nginx-pod.yaml文件

  apiVersion: v1
  kind: Pod
  metadata:
    name: nginx
  spec:
    containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

  284  kubectl create -f ~/services/nginx-pod.yaml
  285  curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/nginx/

  nginx-deployment.yaml
  apiVersion: apps/v1beta1
  kind: Deployment
  metadata:
    name: nginx-deployment
  spec:
    replicas: 2
    template:
      metadata:
        labels:
          app: nignx
      spec:
        containers:
        - name: nginx
          image: nginx:1.7.9
          ports:
            - containerPort: 80

  323  kubectl create -f ~/services/nginx-deployment.yaml 
  324  kubectl get pods -l app=nginx
  235  kubectl get deployment -n kube-system

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雷同,不再贅述。

9.4 操練service

剛才我們在基礎集群上演示了pod,deployments。下面就在剛才的基礎上增加點service元素。

423  kubectl expose deploy kubernetes-bootcamp --type="NodePort" --target-port=8080 --port=80
424  kubectl get services
425  curl 10.0.94.182:39741
426  kubectl get pods -o wide
427  kubectl get services
server01
# docker exec -it cc6aa3fc38a0 bash
1  curl 10.68.34.35
2  curl 172.20.60.133

428  vi ~/services/nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 20000
  selector:
    app: nginx
  type: NodePort

429  kubectl create -f ~/services/nginx-service.yaml 
430  kubectl get services
431  curl 10.0.94.182:20000

10. 為集群增加dns功能 - kube-dns(app)

10.1 簡介

kube-dns為Kubernetes集群提供命名服務,主要用來解析集群服務名和Pod的hostname。目的是讓pod可以通過名字訪問到集群內服務。它通過添加A記錄的方式實現名字和service的解析。普通的service會解析到service-ip。headless service會解析到pod列表。

10.2 部署

通過kubernetes應用的方式部署kube-dns.yaml文件基本與官方一致(除了鏡像名不同外)。 里面配置了多個組件,之間使用”---“分隔

#到kubernetes-starter目錄執行命令

$ kubectl create -f target/services/kube-dns.yaml

10.3 重點配置說明

請直接參考配置文件中的注釋。

10.4 通過dns訪問服務

這了主要演示增加kube-dns后,通過名字訪問服務的原理和具體過程。演示啟動dns服務和未啟動dns服務的通過名字訪問情況差別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM