搭建kubernetes集群及kubernetes集群的應用

  • 本文使用kubernetes版本較老,初次實驗簡單部署,不足之處較多,歡迎交流。

一、容器編排軟件

1、docker編排三劍客:聯(lián)合使用

docker-machine 管理主機容器
docker-swarm 跨主機,監(jiān)控容器
docker-compose 編排主機容器

2、ASF旗下的mesos資源調(diào)度框架,依賴于marathon編排容器

3、 Google旗下的kubernetes,核心思想是一切皆容器,容器調(diào)度框架是Borg

  • Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規(guī)模可伸縮、應用容器化管理。在生產(chǎn)環(huán)境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
  • 在Kubernetes中,我們可以創(chuàng)建多個容器,每個容器里面運行一個應用實例,然后通過內(nèi)置的負載均衡策略,實現(xiàn)對這一組應用實例的管理、發(fā)現(xiàn)、訪問,而這些細節(jié)都不需要運維人員去進行復雜的手工配置和處理。
Kubernetes 特點
  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

  • 可擴展: 模塊化, 插件化, 可掛載, 可組合

  • 自動化: 自動部署,自動重啟,自動復制,自動伸縮/擴展

  • kubernetes代碼托管站點:https://github.com/kubernetes
    官方網(wǎng)站:https://kubernetes.io/

二、Kubernetes組件

物理組件master和node

物理組件

1、Master 組件

ETCD
kube-controller-manager
cloud-controller-manager
kube-scheduler
插件 addons
DNS
用戶界面
容器資源監(jiān)測
Cluster-level Logging

  • Master組件提供集群的管理控制中心,可以在集群中任何節(jié)點上運行,但是為了簡單起見,通常在一臺機器上啟動所有 Master組件,并且不會在此機器上運行用戶容器。

(1)、kube-apiserver

  • kube-apiserver用于暴露Kubernetes API。任何的資源請求/調(diào)用操作都是通過kube-apiserver提供的接口進行。請參閱構建高可用群集。

(2)、 ETCD

  • etcd是Kubernetes提供默認的存儲系統(tǒng),保存所有集群數(shù)據(jù),使用時需要為etcd數(shù)據(jù)提供備份計劃。

(3)、kube-controller-manager

  • kube-controller-manager運行管理控制器,它們是集群中處理常規(guī)任務的后臺線程。邏輯上,每個控制器是一個單獨的進程,但為了降低復雜性,它們都被編譯成單個二進制文件,并在單個進程中運行。

這些控制器包括:

  • 節(jié)點(Node)控制器。

  • 副本(Replication)控制器:負責維護系統(tǒng)中每個副本中的pod。

  • 端點(Endpoints)控制器:填充Endpoints對象(即連接Services&Pods)。

  • Service Account和Token控制器:為新的Namespace創(chuàng)建默認帳戶訪問API Token。

(4)、cloud-controller-manager

  • 云控制器管理器負責與底層云提供商的平臺交互。云控制器管理器是Kubernetes版本1.6中引入的,目前還是Alpha的功能。
  • 云控制器管理器僅運行云提供商特定的(controller loops)控制器循環(huán)。可以通過將--cloud-providerflag設置為external啟動kube-controller-manager ,來禁用控制器循環(huán)。

cloud-controller-manager 具體功能:

  • 節(jié)點(Node)控制器

  • 路由(Route)控制器

  • Service控制器

  • 卷(Volume)控制器

(5)、kube-scheduler

  • kube-scheduler監(jiān)視新創(chuàng)建沒有分配到Node的Pod,為Pod選擇一個Node。

(6)插件 addons

  • 插件(addon)是實現(xiàn)集群pod和Services功能的。Pod由Deployments,ReplicationController等進行管理。Namespace 插件對象是在kube-system Namespace中創(chuàng)建。

(7)DNS

  • 雖然不嚴格要求使用插件,但Kubernetes集群都應該具有集群 DNS。

  • 群集 DNS是一個DNS服務器,能夠為 Kubernetes services提供 DNS記錄。

  • 由Kubernetes啟動的容器自動將這個DNS服務器包含在他們的DNS searches中。

(8)用戶界面

  • kube-ui提供集群狀態(tài)基礎信息查看和容器資源監(jiān)測

  • 容器資源監(jiān)控提供一個UI瀏覽監(jiān)控數(shù)據(jù)。

(9)Cluster-level Logging

  • Cluster-level logging,負責保存容器日志,搜索/查看日志。

2、節(jié)點(Node)組件

kubelet
kube-proxy
docker
RKT
supervisord
fluentd

  • 節(jié)點組件運行在Node,提供Kubernetes運行時環(huán)境,以及維護Pod。

(1)、kubelet

kubelet是主要的節(jié)點代理,它會監(jiān)視已分配給節(jié)點的pod,具體功能:

  • 安裝Pod所需的volume。

  • 下載Pod的Secrets。

  • Pod中運行的 docker(或experimentally,rkt)容器。

  • 定期執(zhí)行容器健康檢查,報告節(jié)點狀態(tài)。

(2)、kube-proxy

  • kube-proxy通過在主機上維護網(wǎng)絡規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā)來實現(xiàn)Kubernetes服務抽象。

(3)、docker

  • docker用于運行容器。

(4)、RKT

  • rkt運行容器,作為docker工具的替代方案。

(5)、supervisord

  • supervisord是一個輕量級的監(jiān)控系統(tǒng),用于保障kubelet和docker運行。

(6)fluentd

  • fluentd是一個守護進程,可提供cluster-level logging.。
核心組件

node節(jié)點內(nèi)部組件

Pod內(nèi)部的容器

3、Node節(jié)點的內(nèi)部組件

  • Pod:一群容器組成
  • Labels:標簽識別Pod組,每創(chuàng)建一個Pod就會打一個Labels標簽
  • Service:選擇器通過Labels選擇出一組功能相同的pod加ip,組成一個service
  • Kubelet :容器代理
  • kube-proxy :kube代理,負載均衡器
  • etcd:數(shù)據(jù)存儲服務
  • cAdvisor :統(tǒng)計代理程序,收集容器資源使用性能統(tǒng)計數(shù)據(jù)
  • Replication Controller:管理復制pod組
  • Scheduler:在工作節(jié)點內(nèi)調(diào)度pod組
  • APIServer: Kubernetes API服務器

4、Pod

Pod內(nèi)部容器通信,存儲
  • 同pod內(nèi)的容器互相通信使用IPC(節(jié)點間通信);
  • 容器可以找到對方的本地主機;
  • 每個容器名字來自pod組名
  • 每個pod都有一個IP地址在一個層面共享網(wǎng)絡空間
  • 在pod內(nèi)的容器中共享一個存儲卷
Pod實現(xiàn)

Label標簽

services實現(xiàn)

5、Services

  • Kubernetes的Service定義了這樣一種抽象:邏輯上的一組 Pod,一種可以訪問它們的策略 —— 通常稱為微服務。 這一組 Pod能夠被 Service訪問到,通常是通過 Label Selector(標簽選擇器)實現(xiàn)的。
  • 對 Kubernetes 集群中的應用,Kubernetes 提供了簡單的 Endpoints API,只要Service 中的一組 Pod發(fā)生變更,應用程序就會被更新。 對非 Kubernetes 集群中的應用,Kubernetes 提供了基于 VIP 的網(wǎng)橋的方式訪問Service,再由 Service 重定向到備用的 Pod。
  • Services可以暴露出集群內(nèi)部或外部,成為一個靜態(tài)API對象,配靜態(tài)IP進行使用。

6、Discovering services服務發(fā)現(xiàn)

第一種:Environment variables環(huán)境變量
第二種:DNS

  • DNS插件:1.3版本,dns實現(xiàn)叫做skydns,以后叫kube-dns
  • Kubernetes 從 1.3 版本起, DNS 是內(nèi)置的服務,通過插件管理器 集群插件 自動被啟動。
  • Kubernetes DNS 在集群中調(diào)度 DNS Pod 和 Service ,配置 kubelet 以通知個別容器使用 DNS Service 的 IP 解析 DNS 名字。

7、kubernetes的網(wǎng)絡

  • kubernetes的集群節(jié)點間通信使用overlay network疊加網(wǎng)絡實現(xiàn)。
  • 疊加網(wǎng)絡的實現(xiàn)軟件有:flannel、calico、contiv等,其中flannel較為成熟可靠。

三、kubernetes集群快速部署

  • 環(huán)境:
    master, etcd:192.168.1.61
    node1:192.168.1.62
    node2:192.168.1.63
    前提:
    1、基于主機名通信:/etc/hosts;
    2、時間同步;
    3、關閉firewalld和iptables.service;

OS:CentOS 7.3.1611, Extras倉庫中;

安裝配置步驟:

1、etcd,僅master節(jié)點;
2、flannel,集群的所有節(jié)點;
3、配置k8s的master:僅master節(jié)點;
kubernetes-master
啟動的服務:
kube-apiserver, kube-scheduler, kube-controller-manager
4、配置k8s的各Node節(jié)點;
kubernetes-node
先設定啟動docker服務;
啟動的k8s的服務:
kube-proxy, kubelet

1、部署kubernetes的master節(jié)點

設置解析hosts文件
[root@node-61 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.61  master.localhost.localdomain master etcd1 registry
192.168.1.62  node1.localhost.localdomain node1
192.168.1.63  node2.localhost.localdomain node2
為了方便節(jié)點間的通信,使用ssh
[root@node-61 ~]# ssh-keygen -t rsa -P ''

[root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1

[root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2

同步hosts文件
[root@node-61 ~]# scp /etc/hosts node1:/etc/
hosts                                                                                                 100%  321     9.8KB/s   00:00    
[root@node-61 ~]# scp /etc/hosts node2:/etc/
hosts                          
查看yum中有無extras倉庫
[root@node-61 ~]# yum repolist
...........
!extras/7/x86_64 
部署etcd

etcd是開源的分布式鍵值存儲,同時支持服務發(fā)現(xiàn),支持leader選舉,由go語言研發(fā),訪問接口是HTTP+JSON的API。
開發(fā)或?qū)嶒灜h(huán)境部署etcd,單節(jié)點即可


開發(fā)或?qū)嶒灜h(huán)境部署etcd

生產(chǎn)環(huán)境部署etcd,多節(jié)點集群部署,一般為奇數(shù)3、5、7、9個。


生產(chǎn)環(huán)境部署etcd
安裝etcd
[root@node-61 ~]# yum install etcd -y

監(jiān)聽兩個端口2379和2380

編輯etcd配置文件
[root@master ~]# vim /etc/etcd/etcd.conf
#[Member]成員配置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"      #存儲目錄
ETCD_LISTEN_PEER_URLS="http://192.168.1.61:2380"      #監(jiān)聽集群地址端口
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.61:2379"    #監(jiān)聽客戶端地址端口
ETCD_NAME="default"   #名稱

#[Clustering]集群配置
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.61:2380"     #集群通告地址端口
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.61:2379"    #集群客戶端口
ETCD_INITIAL_CLUSTER="default=http://192.168.1.61:2380"       #集群成員,如果有多個成員在http中間用,隔離,default要保持與name一致。

  • name:節(jié)點名稱
  • data-dir:指定節(jié)點的數(shù)據(jù)存儲目錄
  • listen-peer-urls: 監(jiān)聽URL,用于與其他節(jié)點通訊
  • listen-client-urls :對外提供服務的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客戶端會連接到這里和 etcd 交互
  • initial-advertise-peer-urls:該節(jié)點同伴監(jiān)聽地址,這個值會告訴集群中其他節(jié)點
  • initial-cluster :集群中所有節(jié)點的信息,格式為 node1=http://ip1:2380,node2=http://ip2:2380,… >。注意:這里的 node1 是節(jié)點的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
  • initial-cluster-state:新建集群的時候,這個值為 new ;假如已經(jīng)存在的集群,這個值為 existing
  • initial-cluster-token : 創(chuàng)建集群的 token,這個值每個集群保持唯一。這樣的話,如果你要重新創(chuàng)建集群,即使配置和之前一樣,也會再次生成新的集群和節(jié)點 uuid;否則會導致多個集群之間的沖突,造成未知的錯誤
  • advertise-client-urls: 對外公告的該節(jié)點客戶端監(jiān)聽地址,這個值會告訴集群中其他節(jié)點
啟動etcd
[root@master ~]# systemctl start etcd
[root@master ~]# ss -tnl
State      Recv-Q Send-Q                                                                   Local Address:Port                                                                                  Peer Address:Port              
LISTEN     0      128                                                                       192.168.1.61:2379                                                                                             *:*                  
LISTEN     0      128                                                                       192.168.1.61:2380                                                                                             *:*    
集群檢查
#集群信息
[root@master ~]# etcdctl -C http://master:2379 member list
8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://192.168.1.61:2379 isLeader=true

#集群健康狀態(tài)
[root@master ~]# etcdctl -C http://master:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.61:2379

etcd鍵值存儲使用
#創(chuàng)建目錄
[root@master ~]# etcdctl -C http://master:2379 mkdir test
[root@master ~]# etcdctl -C http://master:2379 mkdir ls

#查詢目錄
[root@master ~]# etcdctl -C http://master:2379 ls
/test
/ls

#刪除空目錄
[root@master ~]# etcdctl -C http://master:2379 rmdir ls
[root@master ~]# etcdctl -C http://master:2379 ls
/test

#創(chuàng)建鍵值
[root@master ~]# etcdctl -C http://master:2379 mk /test/newkey hello
hello

#獲取鍵值
[root@master ~]# etcdctl -C http://master:2379 get  /test/newkey 
hello

#修改鍵值
[root@master ~]# etcdctl -C http://master:2379 set  /test/newkey hello-world
hello-world

#刪除非空目錄
[root@master ~]# etcdctl -C http://master:2379  rm -r /test

安裝kubernetes-master
[root@master ~]# yum install kubernetes-master -y

配置
[root@master ~]# vim /etc/kubernetes/apiserver
#非安全http協(xié)議的監(jiān)聽地址
KUBE_API_ADDRESS="--insecure-bind-address=192.168.1.61"
#監(jiān)聽端口
# KUBE_API_PORT="--port=8080"
#kubelet監(jiān)聽端口
# KUBELET_PORT="--kubelet-port=10250"
#集群成員,中間用逗號隔開
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.61:2379"
#k8s內(nèi)部服務的地址網(wǎng)段
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#默認的控制:名稱空間生命周期、名稱空間存在、資源限制、安全上下文限制、資源配額
policiesKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
#自定義選項
KUBE_API_ARGS=""
[root@master ~]# vim /etc/kubernetes/config 
#標準日志輸出
KUBE_LOGTOSTDERR="--logtostderr=true"
#日志記錄級別
KUBE_LOG_LEVEL="--v=0"
#是否允許某個節(jié)點運行特權容器
KUBE_ALLOW_PRIV="--allow-privileged=false"
#master地址
KUBE_MASTER="--master=http://192.168.1.61:8080"
~                                                        
啟動kubernetes
#啟動三個服務
[root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@master ~]# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128    192.168.1.61:2379                      *:*                  
LISTEN     0      128    192.168.1.61:2380                      *:*                  
LISTEN     0      128    192.168.1.61:8080                      *:*                  
LISTEN     0      128           *:22                        *:*                  
LISTEN     0      100    127.0.0.1:25                        *:*                  
LISTEN     0      128          :::6443                     :::*                  
LISTEN     0      128          :::10251                    :::*                  
LISTEN     0      128          :::10252                    :::*     
建立docker私有鏡像倉庫
[root@master ~]# yum install docker-distribution -y
[root@master ~]# systemctl start docker-distribution.service

[root@master ~]# ss -tnl

LISTEN     0      128          :::5000                     :::*  

2、node節(jié)點的安裝

  • 兩個node節(jié)點操作,同步時間,關閉防火墻,修改hosts文件。
#安裝docker
[root@node-62 ~]# yum install docker -y

#配置私有倉庫
[root@node-62 ~]# vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.1.61:5000"] }

#啟動docker
[root@node-62 ~]# systemctl start docker

下載鏡像,并上傳到私有倉庫
#從公有倉儲下載centos
[root@node-62 ~]# docker pull centos:latest

#修改標簽
[root@node-62 ~]# docker tag docker.io/centos:latest 192.168.1.61:5000/centos:latest

#上傳到私有倉庫
[root@node-62 ~]# docker push 192.168.1.61:5000/centos:latest

兩個節(jié)點安裝kubernetes的node
[root@node-63 ~]# yum install kubernetes-node -y
配置文件
[root@node-62 ~]# vim /etc/kubernetes/kubelet 
#監(jiān)聽地址
KUBELET_ADDRESS="--address=0.0.0.0"

#監(jiān)聽端口
# KUBELET_PORT="--port=10250"

#使用的主機名稱,如果引號內(nèi)部為空,則使用默認系統(tǒng)主機名
KUBELET_HOSTNAME="--hostname-override=node1"

#指明master主機地址
KUBELET_API_SERVER="--api-servers=http://master:8080"

#基礎架構容器地址
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

#自定義選項
KUBELET_ARGS=""

#全局配置文件
[root@node-62 ~]# vim /etc/kubernetes/config
........
KUBE_MASTER="--master=http://master:8080"   #指明master主機地址端口


#node1配置文件同步到node2上
[root@node-62 ~]# scp /etc/kubernetes/*  node2:/etc/kubernetes/

啟動kubernetes-node
[root@node-62 ~]# systemctl start kubelet.service kube-proxy.service
[root@node-62 ~]# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128    127.0.0.1:10248                     *:*                  
LISTEN     0      128    127.0.0.1:10249                     *:*                  
LISTEN     0      128           *:22                        *:*                  
LISTEN     0      100    127.0.0.1:25                        *:*                  
LISTEN     0      128          :::10250                    :::*                  
LISTEN     0      128          :::10255                    :::*                  
LISTEN     0      128          :::22                       :::*                  
LISTEN     0      100         ::1:25                       :::*                  
LISTEN     0      128          :::4194                     :::* 

3、master節(jié)點運行容器

kubernetes的狀態(tài)查詢
#查看api版本
[root@master ~]# kubectl -s http://master:8080 api-versions
apps/v1beta1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1beta1
autoscaling/v1
batch/v1
certificates.k8s.io/v1alpha1
extensions/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1alpha1
storage.k8s.io/v1beta1
v1

#查看集群相關

[root@master ~]# kubectl -s http://master:8080 cluster-info
Kubernetes master is running at http://master:8080

#獲取詳細信息
[root@master ~]# kubectl -s http://master:8080 cluster-info dump

#獲取節(jié)點信息
[root@master ~]# kubectl -s http://master:8080 get no
NAME      STATUS    AGE
node1     Ready     13h
node2     Ready     13h

#查詢運行pod
[root@master ~]# kubectl -s http://master:8080 get po
運行容器

格式:kubectl run NAME --image=image [--env="key=value"] [--port=port]
[--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] --
[COMMAND] [args...] [options]

name:名字
image:鏡像路徑
--port:暴露端口
--replicas:啟動幾個副本
--dry-run:測試運行
--overrides:覆蓋

--command:改變啟動默認命令

#使用私有倉庫創(chuàng)建pod
[root@master ~]# kubectl -s http://master:8080 run centos7base --image=192.168.1.61:5000/centos:latest --replicas=2
deployment "centos7base" created

#查詢
[root@master ~]# kubectl -s http://master:8080 get deployments
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
centos7base   2         2         2            0           29s

#刪除部署pod
[root@master ~]# kubectl -s http://master:8080 delete deployment centos7base
deployment "centos7base" deleted

創(chuàng)建pod報錯

狀態(tài)始終是 ContainerCreating,各個節(jié)點中也無創(chuàng)建容器
[root@master ~]# kubectl -s http://master:8080 get pods
NAME                    READY     STATUS              RESTARTS   AGE
bbox-3908540199-t7khd   0/1       ContainerCreating   0          4m

#查詢?nèi)罩?
[root@master ~]# kubectl -s http://master:8080 describe pod bbox-3908540199-t7khd
.....................
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

#解決方法
原因是node節(jié)點上:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt這個目錄中是一個軟連接,實際上并沒有這個文件。

#在兩個node節(jié)點上下載
[root@node-62 ~]#  wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

#安裝
[root@node-62 ~]#  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


4、配置flannel網(wǎng)絡

因為flannel的網(wǎng)絡配置要保存在etcd中,所以master和兩個node節(jié)點也要按裝etcd

[root@node-62 ~]# yum install etcd -y
[root@node-62 ~]# yum install flannel -y

修改配置文件
[root@master ~]# vim /etc/sysconfig/flanneld 
#etcd地址端口
FLANNEL_ETCD_ENDPOINTS="http://etcd1:2379"
#存儲路徑
FLANNEL_ETCD_PREFIX="/ilinux.io/network"

#給兩個node節(jié)點同步配置
[root@master ~]# scp /etc/sysconfig/flanneld node2:/etc/sysconfig/

[root@master ~]# scp /etc/sysconfig/flanneld node1:/etc/sysconfig/

#創(chuàng)建網(wǎng)絡
[root@master ~]# etcdctl -C http://etcd1:2379 mk /ilinux.io/network/config '{"Network":"10.7.0.0/16"}'
{"Network":"10.7.0.0/16"}

所有節(jié)點啟動flanneld服務
[root@master ~]# systemctl start flanneld.service

#flannel自動創(chuàng)建一個隧道網(wǎng)橋

[root@master ~]# ifconfig

................
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.7.54.0  netmask 255.255.0.0  destination 10.7.54.0
        inet6 fe80::21d5:9d6a:a31a:d587  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (U

兩個node節(jié)點重新啟動docker服務,使docker自動獲取flannel的地址


[root@node-62 ~]# systemctl restart docker.service
[root@node-62 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.7.9.1  netmask 255.255.255.0  broadcast 0.0.0.0

兩個node節(jié)點容器測試通信

#node1節(jié)點容器
#添加防火墻規(guī)則
[root@node-62 ~]# iptables -A FORWARD -s 10.7.9.0/16 -j ACCEPT

[root@node-62 ~]# docker run --name bbox1 --rm -it busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:09:02  
          inet addr:10.7.9.2  Bcast:0.0.0.0  Mask:255.255.255.0
/ # ping 10.7.90.2


#node2節(jié)點容器
#添加防火墻規(guī)則
[root@node-63 ~]# iptables -A FORWARD -s 10.7.90.0/16 -j ACCEPT

[root@node-63 ~]# docker run --name bbox1 --rm -it busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:5A:02  
          inet addr:10.7.90.2  Bcast:0.0.0.0  Mask:255.255.255.0
/ # ping 10.7.9.2

四、kubernetes的對象

1、運行容器遇到問題

  • (1)、定義在那個節(jié)點中運行那個pod,而pod中運行什么容器。
  • (2)、運行的容器化的應用程序,可以獲得哪些資源。
  • (3)、定義運行的容器化的應用程序各種策略,例如重啟、升級。

kubernetes集群必須確保對象存在,目標狀態(tài),通過kubernetes server交互

kubernetes對象有兩種狀態(tài):
  • spec和status
    spec狀態(tài):目標期望狀態(tài)
    status狀態(tài):當前狀態(tài)
  • 在任何時間,kubernetes control plane要使每個對象處于目標狀態(tài),還要定義有幾個副本。
  • 在集群中要創(chuàng)建對象時候,必須定義對象的目標狀態(tài)的描述信息,放置在配置文件中,格式為JSON或yaml格式。

2、容器編排配置文件

各種類型對象及其相關屬性文檔:
https://v1-9.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.9

apiversion:api版本
kind:指明當前屬于哪一種部署方式
metadata:源數(shù)據(jù)配置段
name:定義deployment引用名稱
spec:目標狀態(tài)配置段
replicas:啟動pod的數(shù)量
template:要創(chuàng)建的pod模板
labels:標簽
app:nginx:鍵值對,鍵app、值nginx
containers:容器,列出pod中的容器,至少應該一個,且不可被更新。

  • name:容器的名字,作為DNS_LBAEL使用,使用后被更新到內(nèi)部DNS。
    image:docker鏡像
  • 對象文件必須定義apiversion、kind、metadata配置
    使用
kubectl create -f ./deployment-example.yaml --record

啟動pod常用格式

Deployment對象格式

DaemonSet對象格式
service對象格式

ports:開放端口
slector:挑選器pod,請求發(fā)往那個pod
type :請求轉(zhuǎn)發(fā)到pod類型,例如:clusterip、loadbalancer,nodeport,extername

3、示例

master節(jié)點啟動服務
[root@master ~]# systemctl start etcd.service
[root@master ~]# systemctl start flanneld.service
[root@master ~]# systemctl start docker-distribution.service
[root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@master ~]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128    192.168.1.61:2379                      *:*                  
LISTEN      0      128    192.168.1.61:2380                      *:*                  
LISTEN      0      128    192.168.1.61:8080                      *:*                  
LISTEN      0      128           *:22                        *:*                  
LISTEN      0      100    127.0.0.1:25                        *:*                  
LISTEN      0      128          :::5000                     :::*                  
LISTEN      0      128          :::6443                     :::*                  
LISTEN      0      128          :::10251                    :::*                  
LISTEN      0      128          :::10252                    :::*                  
LISTEN      0      128          :::22                       :::*                  
LISTEN      0      100         ::1:25   
node1和node2節(jié)點啟動服務
#避免docker下載https報錯,添加
[root@master ~]# vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.1.61:5000"] }

#啟動服務
[root@node-62 ~]# systemctl start flanneld.service docker.service kube-proxy.service  kubelet.service
[root@node-62 ~]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128    127.0.0.1:10248                     *:*                  
LISTEN      0      128    127.0.0.1:10249                     *:*                  
LISTEN      0      128           *:22                        *:*                  
LISTEN      0      100    127.0.0.1:25                        *:*                  
LISTEN      0      128          :::10250                    :::*                  
LISTEN      0      128          :::10255                    :::*                  
LISTEN      0      128          :::22                       :::*                  
LISTEN      0      100         ::1:25                       :::*                  
LISTEN      0      128          :::4194                     :::*     
制作鏡像
[root@node-62 ~]# mkdir bbox-httpd
[root@node-62 ~]# cd bbox-httpd/
#測試網(wǎng)頁
[root@node-62 bbox-httpd]# vim index.html
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

#dockerfile
[root@node-62 bbox-httpd]# vim dockerfile
FROM docker.io/busybox:latest
MAINTAINER "hehe@hehe.com"
ADD index.html /appdata/html/
EXPOSE 80/tcp
CMD ["/bin/httpd","-f","-h","/appdata/html/"]

#制作鏡像
[root@node-62 bbox-httpd]# docker build ./ -t 192.168.1.61:5000/bbox-httpd:v0.2


#推送到私有倉庫
[root@node-62 bbox-httpd]# docker push  192.168.1.61:5000/bbox-httpd:v0.2

#節(jié)點2從私有倉庫下載鏡像
[root@node-63 ~]# docker pull 192.168.1.61:5000/bbox-httpd:v0.2


在master節(jié)點制作對象,嚴格控制縮進
[root@master ~]# vim deploy-bbox.yaml

apiVersion: extensions/v1beta1
kind: Deployment     
metadata:
  name: deploy-bbox  #名稱
spec:                         #定義狀態(tài)
  replicas: 2               #啟動2個
  template:                 #模板
    metadata:
      labels:               #標簽
        # Apply this label to pods and default
        # the Deployment label selector to this value
        app: bbox        #鍵值
    spec:
      containers:         #容器
      - name: bbox-httpd     #名稱
        # Run this image
        image: 192.168.1.61:5000/bbox-httpd:v0.2         #使用鏡像
使用對象創(chuàng)建服務
[root@master ~]# kubectl -s http://master:8080 create -f ./deploy-bbox.yaml
deployment "deploy-bbox" created

#檢查
[root@master ~]# kubectl -s http://master:8080 get pods
NAME                           READY     STATUS    RESTARTS   AGE
deploy-bbox-2224464794-0qz7g   1/1       Running   0          2m
deploy-bbox-2224464794-prn3r   1/1       Running   0          2m


#在node節(jié)點上檢查
[root@node-63 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
a62ea351f09a        registry:5000/bbox-httpd:v0.2                                "/bin/httpd -f -h ..."   27 minutes ago      Up 27 minutes                           k8s_bbox-httpd.80dbe7ba_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_0554d71f
f182922c8df9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           28 minutes ago      Up 27 minutes                           k8s_POD.ae8ee9ac_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_f68413f2

#查詢pod的ip地址
...............
 "IPAddress": "10.7.25.2",

#測試,并顯示測試頁面
[root@node-63 ~]# curl http://10.7.25.2
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

#刪除服務
[root@master ~]# kubectl -s http://master:8080 delete -f ./deploy-bbox.yaml
deployment "deploy-bbox" deleted

集群內(nèi)訪問service
#編輯service對象
[root@master ~]# vim bbox-httpd-service.yaml
kind: Service    #定義類型為服務
apiVersion: v1
metadata:
  # Unique key of the Service instance
  name: bbox-httpd-service     #名稱
spec:
  ports:
    # Accept traffic sent to port 80
    - name: http
      port: 80                    #監(jiān)聽端口
      targetPort: 80          #暴露端口
  selector:
    # Loadbalance traffic across Pods matching
    # this label selector
    app: bbox
  type: LoadBalancer      #訪問為輪詢

#創(chuàng)建服務
[root@master ~]# kubectl -s http://master:8080  create -f ./bbox-httpd-service.yaml 
service "bbox-httpd-service" created

#查詢服務狀態(tài)
[root@master ~]# kubectl -s http://master:8080  get service
NAME                 CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
bbox-httpd-service   10.254.18.11   <pending>     80:31849/TCP   14s
kubernetes           10.254.0.1     <none>        443/TCP        7d

[root@master ~]# kubectl -s http://master:8080  describe service
Name:           bbox-httpd-service
Namespace:      default
Labels:         <none>
Selector:       app=bbox
Type:           LoadBalancer
IP:         10.254.241.102
Port:           http    80/TCP
NodePort:       http    32303/TCP
Endpoints:      10.20.52.2:80,10.20.64.2:80
Session Affinity:   None
No events.


#node節(jié)點上的iptable規(guī)則
[root@node-63 ~]# iptables -t nat -vnL | grep 10.254
    0     0 KUBE-SVC-PJU34ZRWOF2LNB5M  tcp  --  *      *       0.0.0.0/0            10.254.241.102       /* default/bbox-httpd-service:http cluster IP */ tcp dpt:80
    0     0 KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  *      *       0.0.0.0/0            10.254.0.1           /* default/kubernetes:https cluster IP */ tcp dpt:443

#集群內(nèi)部訪問測試
[root@node-62 ~]#   curl http://10.254.241.102
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

[root@node-63 ~]#   curl http://10.254.241.102
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

4、Ingress應用

因為k8s內(nèi)部使用的ip,只能集群內(nèi)部使用,因此集群外部無法訪問內(nèi)部應用或服務的ip地址,建立Ingress使service的url映射映射到master的url上,用戶訪問master的url即可訪問內(nèi)部service。

參考鏈接:https://cloud.tencent.com/developer/article/1156329

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容