Centos7部署Kubernetes

廢話不多說,一把梭!開幹!


實驗環境:    
    master 192.168.1.5    (controller,etcd)
    node1  192.168.1.16
    node2  192.168.1.19
    
關閉每臺主機的安全策略:(僅實驗環境)
    systemctl stop firewalld
    iptables -F
    setenforce 0
    
    

Master運行組件:    

1、kube-apiserver
    API Server 提供HTTP/HTTPS ,即kubernetes API。各種客戶端工具以及Kubernetes其他組件可以
通過它來管理Cluster的各種資源。

2、kube-scheduler
    Scheduler 負責決定將Pod放在哪個Node上運行,主要負責調度,根據當前Cluster的結構,滿足負載、
高可用、性能等需求。

3、kube-controller-manager
 
   Controller Manager 負責管理Cluster各種資源,不同的controller管理不同的資源。

4、etcd
    etcd 負責保存kubernetes cluster 的配置信息和各種資源的狀態信息。當信息發生改變時,etcd會立即
通知kubernetes的各個組件。

5、Pod 網絡
    Pod 要能夠通信必須要部署Pod網絡,flannel是其中的一種方案。


[root@k8s-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.5  master
192.168.1.16 node1
192.168.1.19 node2


[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts


[root@k8s-master ~]# yum -y install kubernetes-master etcd

etcd概述:

    etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來
自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並通過Raft一致性算法處理日誌複製以保證強一致性。Raft是
一個來自Stanford的新的一致性算法,適用於分佈式系統的日誌複製,Raft通過選舉的方式來實現一致性,在Raft
中,任何一個節點都可能成爲Leader。Google的容器集羣管理系統Kubernetes、開源PaaS平臺Cloud Foundry和
CoreOS的Fleet都廣泛使用了etcd。




[root@k8s-master etcd]# cat /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                 //數據庫位置
#ETCD_WAL_DIR=""                                        //默認存放數據的位置/var/lib/etcd/
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"              //監聽其他etcd的地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"   //監聽etcd客戶端地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="master"                                        //節點名稱
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://master:2380"      //通告其他etcd的地址
ETCD_ADVERTISE_CLIENT_URLS="http://master:2379,http://master:4001" //通告客戶端的地址
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
ETCD_INITIAL_CLUSTER="master=http://master:2380,node1=http://node1:2380,node2=http://node2:2380" //初始化集羣內的地址
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" //初始化集羣
ETCD_INITIAL_CLUSTER_STATE="new"          //新建集羣
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"




如果出現了request sent was ignored (cluster ID mismatch:)報錯,解決方法如下:
    將etcd的數據目錄刪除,然後在重啓etcd                   [/var/lib/etcd/default.etcd/]

    



etcd節點配置:    
[root@k8s-node1 ~]# yum -y install kubernetes-node etcd flannel docker
[root@k8s-node1 ~]# cat /etc/etcd/etcd.conf | grep -v "^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="node1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.16:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://node1:2379,http://node1:4001"
ETCD_INITIAL_CLUSTER="master=http://master:2380,node1=http://node1:2380,node2=http://node2:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"





查看集羣狀態:
[root@k8s-node1 etcd]# etcdctl cluster-health
member 43bb846a7344a01f is healthy: got healthy result from http://node2:2379
member 70192b54fb86c1a5 is healthy: got healthy result from http://master:2379
member a9aee06e6a14d468 is healthy: got healthy result from http://node1:2379
cluster is healthy

圖片.png





kubernetes控制端配置:

[root@k8s-master ~]# cat /etc/kubernetes/apiserver | grep -v "^#"
#在本地服務器上的地址進行偵聽。
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
#在本地服務器上的端口偵聽。
KUBE_API_PORT="--port=8080"
#端口管理員偵聽
KUBELET_PORT="--kubelet-port=10250"
#ETCD集羣中節點的逗號分隔列表
KUBE_ETCD_SERVERS="--etcd-servers=http://master:2379,http://=node1:2379,http://=node2:2379"
#集羣地址範圍
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#默認接納控制策略
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
#加上你自己的參數,默認爲空
KUBE_API_ARGS=""


[root@k8s-master ~]# systemctl start kube-apiserver
[root@k8s-master ~]# systemctl start kube-controller-manager
[root@k8s-master ~]# systemctl start kube-scheduler




kubernetes節點配置:

[root@k8s-node1 ~]# cat /etc/kubernetes/config | egrep -v "^#|$^"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://master:8080"    



kubelet配置:
[root@k8s-node1 ~]# cat /etc/kubernetes/kubelet | egrep -v "^#|$^"
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=192.168.1.16"
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@k8s-node1 ~]# cat /etc/sysconfig/flanneld | egrep -v "^#|$^"
FLANNEL_ETCD_ENDPOINTS="http://master:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"


開啓kubelet服務:
[root@k8s-node1 ~]# systemctl start kubelet


查看集羣狀態:
[root@k8s-master ~]# kubectl get nodes
NAME           STATUS    AGE
192.168.1.16   Ready     14h
192.168.1.19   Ready     14h
圖片.png




集羣的使用:

我已經在我節點上下載好docker鏡像,關於docker部分可以參考我之前的文章。

圖片.png



docker 和k8s的關係:

    docker是一個開源的應用容器引擎,開發者可以打包他們的應用及依賴到一個可移植的容器中,發佈到流行的Linux機器上,也可實現虛擬化。

    k8s是一個開源的容器集羣管理系統,可以實現容器集羣的自動化部署、自動擴縮容、維護等功能。

簡單的來說,就是用kubernetes去管理Docker集羣,即可以將Docker看成Kubernetes內部使用的低級別組件。另外,kubernetes不僅僅支持Docker,還支持其他的容器技術。



如果不指定namespace會默認的在default中創建

[root@k8s-master ~]# kubectl run 01nginx --image=docker.io/nginx  --replicas=2 --port=80
deployment "nginx" created


[root@k8s-master ~]# kubectl get pods
NAME                       READY     STATUS             RESTARTS   AGE
01nginx-2977218101-509gt   1/1       Running            0          15h
01nginx-2977218101-x8057   1/1       Running            0          15h

圖片.png



[root@k8s-master ~]# kubectl get pod  -o wide
nginx-2081865075-h175t     1/1       Running            0          16h       172.17.0.4   192.168.1.19
nginx-2081865075-rhspz     1/1       Running            0          16h       172.17.0.3   192.168.1.19
圖片.png





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章