Kubernetes --(k8s)入門

k8s 簡介:

什麼是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

Kubernetes (k8s )核心組件

  1. etcd etcd是一個高可用的鍵值存儲系統,K8s使用它來存儲各個資源的狀態,從而實現了Restful的API;
  2. api server 提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API註冊和發現等機制;
  3. controller manager 負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等;
  4. scheduler 負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上;
  5. kubelet 負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;
  6. Container runtime 負責鏡像管理以及Pod和容器的真正運行(CRI);
  7. kube-proxy 負責爲Service提供cluster內部的服務發現和負載均衡;

master與node節點服務:

  • Master節點上面主要由四個模塊組成:APIServer、scheduler、controller manager、etcd
  • Node節點主要由三個模塊組成:kubelet、kube-proxy、runtime

  • coredns 負責爲整個集羣提供DNS服務
  • flanneld 負責爲整個集羣提供網絡服務


pod建立過程

kubernetes之pod生命週期:https://www.kubernetes.org.cn/5335.htmlgit


k8s中的名詞概念

cluster

cluster 是計算、存儲、網絡資源的集合,k8s利用這些資源運行各類基於容器的應用github

master

master 是cluster的大腦,他的主要職責是調度,即決定將應用放在哪裏運行。master運行linux操做系統,能夠是物理機或者虛擬機。爲了高可用,能夠運行多個masterdocker

node

node的職責是運行容器應用。node由master管理,node負責監控並彙報容器的狀態,同時根據master的要求管理容器的生命週期。node運行在linuxjson

pod

pod是k8s最小工做單元.Pod是最小的,管理,建立,計劃的最小單元,每一個pod包含一個或多個容器;pod中的容器會做爲一個總體被master調度到一個node上運行vim

controller

k8s一般不會直接建立pod,而是經過controller來管理pod的;controller中定義了pod的部署特性,好比有幾個劇本,在什麼樣的node上運行等。爲了知足不一樣的業務場景,k8s提供了多種controller ,包括:deployment 、replicaset、daemonset 、job 等centos

deployment

Deployment爲Pod和ReplicaSet提供了一個聲明式定義(declarative)方法。使用Deployment來建立ReplicaSet;ReplicaSet在後臺建立pod。

  • 定義Deployment來建立Pod和ReplicaSet
  • 滾動升級和回滾應用
  • 擴容和縮容
  • 暫停和繼續Deployment

replicaset

Deployment建立ReplicaSet;ReplicaSet在後臺建立pod.replicaset實現了pod的多副本管理。使用deployment時會自動建立replicaset,也就是說deployment是經過replicaset來管理pod的多個副本的,咱們一般不須要直接使用replicaset

保證了在全部時間內,都有特定數量的Pod副本正在運行,若是太多了,Replication Controller就殺死幾個,若是太少了,Replication Controller會新建幾個,和直接建立的pod不一樣的是,Replication Controller會替換掉那些刪除的或者被終止的pod,無論刪除的緣由是什麼(維護阿,更新啊,Replication Controller都不關心)

daemonset

DaemonSet保證在每一個Node上都運行一個容器副本,經常使用來部署一些集羣的日誌、監控或者其餘系統管理應用,

  • 日誌收集,好比fluentd,logstash等
  • 系統監控,好比Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系統程序,好比kube-proxy, kube-dns, glusterd, ceph等

StatefulSet

穩定的持久化存儲;可以保證pod的每一個副本在整個生命週期中名稱是不變的;當某個pod發生故障須要刪除並從新啓動時,pod的名稱會發生變化,同時statefulset會保證副本按照固定的順序啓動、更新或者刪除
詳解網址:https://www.kubernetes.org.cn/statefulset

job

Job負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。

CronJob

CronJob即定時任務,就相似於Linux系統的crontab,在指定的時間週期運行指定的任務。在Kubernetes 1.5,使用CronJob須要開啓batch/v2alpha1 API,即–runtime-config=batch/v2alpha1
https://www.kubernetes.org.cn/cronjob

service

https://www.kubernetes.org.cn/kubernetes-services
http://www.javashuo.com/article/p-pyxnexwv-kp.html

namespace

能夠將一個物理的cluster邏輯上劃分紅多個虛擬cluster,每一個cluster就是一個namespace。不一樣的namespace裏的資源是徹底隔離的


部署k8s集羣

實驗集羣環境

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節點運行命令

第一步:初始化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

爲k8s添加節點

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/*     從新添加節點需刪除上次添加節點時生成的文件

token過時了怎麼辦

  1. 經過kubeadm初始化後,都會提供node加入的token
  2. 默認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

k8s集羣建立pods

第一步:建立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 可用的數量

分析建立過程

  1. kubectl 經過api-server建立nginx deployment
  2. deployment-manager 建立nginx deployment
  3. scheduler把兩個pod調度到不一樣的節點之上
  4. 節點之上的kubelet建立兩個pod

k8s集羣deployment

第一步:查看當前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

相關文章
相關標籤/搜索