廢話不多說,一把梭!開幹!
實驗環境:
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
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
集羣的使用:
我已經在我節點上下載好docker鏡像,關於docker部分可以參考我之前的文章。
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
[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