什麼是k8s?html
Kubernetes (k8s)是Google開源的容器集羣管理系統(谷歌內部:Borg)。在Docker技術基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整的功能,提升了大規模容器集羣管理的便捷性。node
Kubernetes的優點:linux
Kubernetes (k8s) 官網:https://kubernetes.io/
Kubernetes (k8s) 官方文檔:https://kubernetes.io/docs/home/
Kubernetes(k8s)中文文檔:https://www.kubernetes.org.cn/k8snginx
- etcd etcd是一個高可用的鍵值存儲系統,K8s使用它來存儲各個資源的狀態,從而實現了Restful的API;
- api server 提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API註冊和發現等機制;
- controller manager 負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等;
- scheduler 負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上;
- kubelet 負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;
- Container runtime 負責鏡像管理以及Pod和容器的真正運行(CRI);
- kube-proxy 負責爲Service提供cluster內部的服務發現和負載均衡;
- Master節點上面主要由四個模塊組成:APIServer、scheduler、controller manager、etcd
- Node節點主要由三個模塊組成:kubelet、kube-proxy、runtime
- coredns 負責爲整個集羣提供DNS服務
- flanneld 負責爲整個集羣提供網絡服務
kubernetes之pod生命週期:https://www.kubernetes.org.cn/5335.htmlgit
cluster 是計算、存儲、網絡資源的集合,k8s利用這些資源運行各類基於容器的應用github
master 是cluster的大腦,他的主要職責是調度,即決定將應用放在哪裏運行。master運行linux操做系統,能夠是物理機或者虛擬機。爲了高可用,能夠運行多個masterdocker
node的職責是運行容器應用。node由master管理,node負責監控並彙報容器的狀態,同時根據master的要求管理容器的生命週期。node運行在linuxjson
pod是k8s最小工做單元.Pod是最小的,管理,建立,計劃的最小單元,每一個pod包含一個或多個容器;pod中的容器會做爲一個總體被master調度到一個node上運行vim
k8s一般不會直接建立pod,而是經過controller來管理pod的;controller中定義了pod的部署特性,好比有幾個劇本,在什麼樣的node上運行等。爲了知足不一樣的業務場景,k8s提供了多種controller ,包括:deployment 、replicaset、daemonset 、job 等centos
Deployment爲Pod和ReplicaSet提供了一個聲明式定義(declarative)方法。使用Deployment來建立ReplicaSet;ReplicaSet在後臺建立pod。
- 定義Deployment來建立Pod和ReplicaSet
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續Deployment
Deployment建立ReplicaSet;ReplicaSet在後臺建立pod.replicaset實現了pod的多副本管理。使用deployment時會自動建立replicaset,也就是說deployment是經過replicaset來管理pod的多個副本的,咱們一般不須要直接使用replicaset
保證了在全部時間內,都有特定數量的Pod副本正在運行,若是太多了,Replication Controller就殺死幾個,若是太少了,Replication Controller會新建幾個,和直接建立的pod不一樣的是,Replication Controller會替換掉那些刪除的或者被終止的pod,無論刪除的緣由是什麼(維護阿,更新啊,Replication Controller都不關心)
DaemonSet保證在每一個Node上都運行一個容器副本,經常使用來部署一些集羣的日誌、監控或者其餘系統管理應用,
- 日誌收集,好比fluentd,logstash等
- 系統監控,好比Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
- 系統程序,好比kube-proxy, kube-dns, glusterd, ceph等
穩定的持久化存儲;可以保證pod的每一個副本在整個生命週期中名稱是不變的;當某個pod發生故障須要刪除並從新啓動時,pod的名稱會發生變化,同時statefulset會保證副本按照固定的順序啓動、更新或者刪除
詳解網址:https://www.kubernetes.org.cn/statefulset
Job負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。
CronJob即定時任務,就相似於Linux系統的crontab,在指定的時間週期運行指定的任務。在Kubernetes 1.5,使用CronJob須要開啓batch/v2alpha1 API,即–runtime-config=batch/v2alpha1
https://www.kubernetes.org.cn/cronjob
https://www.kubernetes.org.cn/kubernetes-services
http://www.javashuo.com/article/p-pyxnexwv-kp.html
能夠將一個物理的cluster邏輯上劃分紅多個虛擬cluster,每一個cluster就是一個namespace。不一樣的namespace裏的資源是徹底隔離的
node1 : IP=192.168.137.3 ;MEM-->2G ;CPU-->2核 ;關閉交換分區 master
node2 : IP=192.168.137.4 ;MEM-->2G ;CPU-->2核 ;關閉交換分區 node
node3 : IP=192.168.137.5 ;MEM-->2G ;CPU-->2核 ;關閉交換分區 node
第一步:主機名解析
╭─root@node* ~ ╰─➤ vim /etc/hosts ... 192.168.137.3 node1 192.168.137.4 node2 192.168.137.5 node3
第二步:禁用交換分區
╭─root@node* ~ ╰─➤ swapoff -a ╭─root@node* ~ ╰─➤ vim /etc/fstab ... #/dev/mapper/cl-swap swap swap defaults 0 0 ... ╭─root@node* ~ ╰─➤ free -h total used free shared buff/cache available Mem: 1.8G 821M 204M 50M 797M 738M Swap: 0B 0B 0B
第三步:安裝docker
╭─root@node* ~ ╰─➤ cat docker-sbeed.sh #!/bin/bash wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo mv docker-ce.repo /etc/yum.repos.d yum install docker-ce -y # aliyun 鏡像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://*****.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ╭─root@node* ~ ╰─➤ bash docker-sbeed.sh
第四步:要保證打開內置的橋功能,這個是藉助於iptables來實現的
╭─root@node2 ~ ╰─➤ echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables # 須要安裝docker纔會成/proc/sys/net/bridge/bridge-nf-call-iptables
第五步:準備k8s安裝源
╭─root@node* ~ ╰─➤ vim /etc/yum.repos.d/k8s.repo [k8s] name=k8s enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
第六步:下載程序包
╭─root@node* ~ ╰─➤ yum install kubelet kubectl kubeadm -y # kubelet 實現pod建立 # kubeadm 集羣初始化 # kubectl 命令行工做
第七步:kubelet開機自啓
╭─root@node* ~ ╰─➤ systemctl enable kubelet
第一步:初始化master
╭─root@node1 ~ ╰─➤ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.2 --apiserver-advertise-address 192.168.137.3 --pod-network-cidr=10.244.0.0/16 # # –image-repository string:這個用於指定從什麼位置來拉取鏡像(1.13版本纔有的),默認值是k8s.gcr.io,咱們將其指定爲國內鏡像地址:registry.aliyuncs.com/google_containers # # –kubernetes-version string:指定kubenets版本號,默認值是stable-1,會致使從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,咱們能夠將其指定爲固定版本(v1.15.1)來跳過網絡請求。 # # –apiserver-advertise-address 指明用 Master 的哪一個 interface 與 Cluster 的其餘節點通訊。若是 Master 有多個 interface,建議明確指定,若是不指定,kubeadm 會自動選擇有默認網關的 interface。 # # –pod-network-cidr指定 Pod 網絡的範圍。Kubernetes 支持多種網絡方案,並且不一樣網絡方案對 –pod-network-cidr有本身的要求,這裏設置爲10.244.0.0/16 是由於咱們將使用 flannel 網絡方案,必須設置成這個 CIDR。
若是初始化失敗,請使用以下代碼清除後從新初始化
kubeadm reset ifconfig cni0 down ip link delete cni0 ifconfig flannel.1 down ip link delete flannel.1 rm -rf /var/lib/cni/ rm -rf /var/lib/etcd/*
第二步:配置kubectl
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # kubectl 是管理 Kubernetes Cluster 的命令行工具,前面咱們已經在全部的節點安裝了 kubectl。Master 初始化完成後須要作一些配置工做,而後 kubectl 就能使用了
爲了使用更便捷,啓用 kubectl 命令的自動補全功能
╭─root@node1 ~ ╰─➤ echo "source <(kubectl completion bash)" >> ~/.bashrc
第三步:安裝pod網絡
╭─root@node1 ~ ╰─➤ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 要讓 Kubernetes Cluster 可以工做,必須安裝 Pod 網絡,不然 Pod 之間沒法通訊。 # Kubernetes 支持多種網絡方案,這裏咱們先使用 flannel
node 節點操做
╭─root@node2 ~ ╰─➤ kubeadm join 192.168.137.3:6443 --token 1lxhha.rvtg5i1n53vm9hs1 \ --discovery-token-ca-cert-hash sha256:0b5ce146f98a5efcfddda3637374de1e62d69e10f1b9e37e792e0ac555422039 # 經過kubeadm初始化後,都會提供node加入的token (在初始化的最後一行輸出) # node 節點加入運行此命令便可 # rm -rf /etc/kubernetes/* 從新添加節點需刪除上次添加節點時生成的文件
- 經過kubeadm初始化後,都會提供node加入的token
- 默認token的有效期爲24小時,當過時以後,該token就不可用了
第一步:在master節點上從新生成token
╭─root@node1 ~ ╰─➤ kubeadm token create zlbwtm.1mtft6bb9k7a2108
第二步:在master節點上獲取證書sha256 編碼hash值
╭─root@node1 ~ ╰─➤ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 0b5ce146f98a5efcfddda3637374de1e62d69e10f1b9e37e792e0ac555422039
第三步:在node節點上節點加入集羣
╭─root@node3 ~ ╰─➤ kubeadm join 192.168.137.3:6443 --token zlbwtm.1mtft6bb9k7a2108 --discovery-token-ca-cert-hash sha256:0b5ce146f98a5efcfddda3637374d e1e62d69e10f1b9e37e792e0ac555422039
第一步:建立nginx pod
╭─root@node1 ~ ╰─➤ kubectl run nginx --image=nginx -r 2 # -r 指定建立的pod數量
第二步:查看pod (詳細)
╭─root@node1 ~ ╰─➤ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7bb7cd8db5-d2qf2 0/1 ContainerCreating 0 5m56s <none> node2 <none> <none> nginx-7bb7cd8db5-sr7qt 0/1 ContainerCreating 0 5m56s <none> node3 <none> <none>
第三步:查看deployment
# kubectl api-resources 查看縮寫 ╭─root@node1 ~ ╰─➤ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx 0/2 2 0 15m # READY 2/2 第一個2是已經啓動的pod數,第二個2是須要總共啓動的pod數量 # UP-TO-DATE 須要的數量 # AVAILABLE 可用的數量
- kubectl 經過api-server建立nginx deployment
- deployment-manager 建立nginx deployment
- scheduler把兩個pod調度到不一樣的節點之上
- 節點之上的kubelet建立兩個pod
第一步:查看當前deployment
╭─root@node1 ~ ╰─➤ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx 0/2 2 0 15m
第二步:查看當前deployment詳細信息
╭─root@node1 ~ ╰─➤ kubectl describe deploy nginx Name: nginx Namespace: default CreationTimestamp: Tue, 20 Aug 2019 03:43:44 -0400 Labels: run=nginx Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=nginx Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-7bb7cd8db5 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 56m deployment-controller Scaled up replica set nginx-7bb7cd8db5 to 2
第三步:查看replicaset
╭─root@node1 ~ ╰─➤ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-7bb7cd8db5 2 2 2 58m
第四步:查看replicaset詳細信息
╭─root@node1 ~ ╰─➤ kubectl describe rs nginx-7bb7cd8db5 Name: nginx-7bb7cd8db5 Namespace: default Selector: pod-template-hash=7bb7cd8db5,run=nginx Labels: pod-template-hash=7bb7cd8db5 run=nginx Annotations: deployment.kubernetes.io/desired-replicas: 2 deployment.kubernetes.io/max-replicas: 3 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/nginx # replicaset 被deployment管理 Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: pod-template-hash=7bb7cd8db5 run=nginx Containers: nginx: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 60m replicaset-controller Created pod: nginx-7bb7cd8db5-sr7qt Normal SuccessfulCreate 60m replicaset-controller Created pod: nginx-7bb7cd8db5-d2qf2
第五步:查看pod詳細信息
╭─root@node1 ~ ╰─➤ kubectl get po NAME READY STATUS RESTARTS AGE nginx-7bb7cd8db5-d2qf2 1/1 Running 0 62m nginx-7bb7cd8db5-sr7qt 1/1 Running 0 62m ╭─root@node1 ~ ╰─➤ kubectl describe pod nginx-7bb7cd8db5-d2qf2 Name: nginx-7bb7cd8db5-d2qf2 Namespace: default Priority: 0 Node: node2/192.168.137.4 Start Time: Tue, 20 Aug 2019 03:43:46 -0400 Labels: pod-template-hash=7bb7cd8db5 run=nginx Annotations: <none> Status: Running IP: 10.244.1.2 Controlled By: ReplicaSet/nginx-7bb7cd8db5 Containers: nginx: Container ID: docker://67466adb9736a6d86f12513f589fa50c47003b7f37ca1abb0155a39b37064d0c Image: nginx Image ID: docker-pullable://nginx@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9 Port: <none> Host Port: <none> State: Running Started: Tue, 20 Aug 2019 04:02:04 -0400 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-ngn4n (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-ngn4n: Type: Secret (a volume populated by a Secret) SecretName: default-token-ngn4n Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulled 45m kubelet, node2 Successfully pulled image "nginx" Normal Created 45m kubelet, node2 Created container nginx Normal Started 45m kubelet, node2 Started container nginx
第六步:監測pod日誌
╭─root@node1 ~ ╰─➤ kubectl logs -f nginx-7bb7cd8db5-d2qf2