kubernetes-安裝部署-2

部署

1、手動安裝

​ 安裝: 都需要編譯或二進制安裝, 證書\網絡也需要手動安裝

​ master: API Serveer, Scheduler, Controller-manage, etcd 都需要當守護進程啓動,

​ node: kubelet, docker(或者說容器引擎), kube-proxy

2、kuberadm

​ k8s官方提供的一個集羣部署工具, 每個節點都需要安裝 docker-ce, kubelet 下載地址部署md

master: API Serveer, Scheduler, Controller-manage, etcd 運行在kubelet上, 運行爲pod

node: node節點都需要安裝 kubelet,docker, 其中kub-proxy 也會運行爲pod

docker-ce: 容器組件 kubelet: 運行pod的核心組件
在這裏插入圖片描述

2.1、安裝前置

2.1.1、kubernetes倉庫源

https://yum.kubernetes.io/
https://packages.cloud.google.com/yum/repos

2.1.2、安裝前提

1、基於主機名通信:/etc/hosts;   這個是必須的

2、時間同步;   ntpdate pool.ntp.org
	*/1 * * * * /usr/sbin/ntpdate pool.ntp.org &>/dev/null 
	
3、關閉firewalld和iptables.service;
	systemctl disable firewalld
    OS:CentOS 7.5.1804

4、禁用swap   swapoff -a   
   禁用 /etc/fstab  # /dev/mapper/centos-swap swap   swap  defaults        0 0

2.1.3、配置前提

1、etcd cluster,僅master節點;

2、flannel,集羣的所有節點;

3、配置k8s的master:僅master節點;
    kubernetes-master
    啓動的服務:
        kube-apiserver, kube-scheduler, kube-controller-manager

4、配置k8s的各Node節點;
    kubernetes-node
    先設定啓動docker服務;
    啓動的k8s的服務:
        kube-proxy, kubelet

2.1.4、kubadm安裝前提

1、master, nodes: 安裝kubelet, kubeadm, docker

2、master: kubeadm init 集羣初始化

3、nodes:  kubeadm join 基於token認證加入到集羣中
	部署文檔: https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
	
4、安裝包說明 
	無論是master和node安裝都是server端, 連接至server端才安裝客戶端
	
5、如果用kubadm安裝只需要安裝
	kubeadm, docker-ce, kubelet, flannel
	
6、安裝kubadm只能是在線安裝用 
	阿里鏡像源:https://developer.aliyun.com/mirror/kubernetes

2.2、 節點前置

2.2.1、節點說明

master, etcd:192.168.9.30
node1:192.168.9.31
node2:192.168.9.32

2.2.2、 鏡像配置

  • kubernents鏡像
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • docker鏡像
    # step 1: 安裝必要的一些系統工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    # Step 2: 添加軟件源信息
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # Step 3: 更新並安裝Docker-CE
    sudo yum makecache fast
    

2.3、安裝

2.3.1、節點軟件安裝

master
# yum -y install docker-ce kubelet kubeadm kubectl
當前版本
docker-ce.x86_64 3:19.03.8-3.el7         
kubeadm.x86_64   0:1.18.0-0         
kubectl.x86_64   0:1.18.0-0        
kubelet.x86_64   0:1.18.0-0        

node
# 如果不用客戶端工具 可以不用安裝kubectl
# yum -y install docker-ce kubelet kubeadm kubectl
docker

​ 若要通過默認的k8s.gcr.io鏡像倉庫獲取Kubernetes系統組件的相關鏡像,需要配置docker UnitFile(/usr/lib/systemd/system/docker.service文件)中的Environment變量,爲其定義合用的HTTPS_PROXY,格式如下:

[Service]
# 訪問https時通過這個代理訪問並加載這個鏡像文件,  
# Environment="HTTPS_PROXY=http://ik8s.io:10070"   不要這個,後續讓它默認加載阿里雲鏡像,

# 與本地主機不需要代理,在ExecStart之前寫入配置
Environment="NO_PROXY=192.168.9.0/24,127.0.0.0/8" 

​ 另外,docker自1.13版起會自動設置iptables的FORWARD默認策略爲DROP,這可能會影響Kubernetes集羣依賴的報文轉發功能,因此,需要在docker服務啓動後,重新將FORWARD鏈的默認策略設備爲ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,

在“ExecStart=/usr/bin/dockerd”一行之後新增一行如下內容:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

啓動docker

# 初始化說明
# https://kubernetes.io/docs/setup/production-environment/container-runtimes/


cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
      "https://kfwkfulq.mirror.aliyuncs.com",
      "https://2lqq34jg.mirror.aliyuncs.com",
      "https://pee6w651.mirror.aliyuncs.com",
      "https://registry.docker-cn.com",
      "http://hub-mirror.c.163.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

~]# systemctl daemon‐reload
~]# systemctl start docker.service
~]# systemctl enable docker          # 設置開機自啓

~]#  docker info
 HTTPS Proxy: http://ik8s.io:10070
 No Proxy: 192.168.100.0/24,127.0.0.0/8

解決docker info警告問題

~]# cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
~]# sysctl --system

~]# cat /etc/sysconfig/kubelet  # 添加
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
kubelet
 ~]#  rpm -ql kubelet     # kubelet安裝之後的軟件
/etc/kubernetes/manifests
/etc/sysconfig/kubelet
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service

# 設置忽略swap啓用的錯誤, /etc/sysconfig/kubelet, 內容如下
 KUBELET_EXTRA_ARGS="--fail-swap-on=false"
 KUBE_PROXY_MODE=ipvs   # 使其支持ipvs規則
 
# 開機時需要手動裝載至內核
  ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh, nf_conntrack_ipv4

# 頭次配置所有節點都只需要開機自啓無需start
~]# systemctl enable kubelet

開啓k8s ipvs

# 開機時需要手動裝載至內核
  ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh, nf_conntrack_ipv4

]# kubectl get configmap -n kube-system

~]# kubectl get configmaps -n kube-system -o yaml kube-proxy 
    apiVersion: v1  # 不配置默認就是mode
    data:
      config.conf: |-
        iptables: xxxx
        ipvs:    xxxx
        mode: ""
        
]# 將Mode修改爲ipvs, 並重新加載k8s就能將k8s默認的iptables修改爲ipvs規則了
kubeadm

kubeadm init 參數說明

參數 說明 說明
–apiserver-advertise-address 地址 監聽的本地地址可忽略
–apiserver-bind-port 默認: 6443 指定api綁定的端口
–image-repository registry.aliyuncs.com/google_containers 指定下載鏡像
–ignore-preflight-errors 如 =Swap 忽略錯誤swap錯誤
–kubernetes-version 如v1.16.3 初始化時指定k8s的版本號
–service-cidr 默認:10.96.0.0/12 指定集羣虛擬網絡
–pod-network-cidr 默認:10.244.0.0/16 指定pod容器網絡

​ 若未禁用Swap設備,則需要編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啓用的狀態錯誤,內容如下: KUBELET_EXTRA_ARGS="‐‐fail‐swap‐on=false"

 ~]# kubeadm init  --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
 
[ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.6.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1

# 使用阿里雲鏡像,  但需要在docker.service中註釋Environment="HTTPS_PROXY=xx"   
# kubeadm init  --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.16.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

初始化操作主要經歷了下面15個步驟,每個階段均輸出均使用[步驟名稱]作爲開頭

  1. [init]:指定版本進行初始化操作
  2. [preflight] :初始化前的檢查和下載所需要的Docker鏡像文件。
  3. [kubelet-start]:生成kubelet的配置文件”/var/lib/kubelet/config.yaml”,沒有這個文件kubelet無法啓動,所以初始化之前的kubelet實際上啓動失敗。
  4. [certificates]:生成Kubernetes使用的證書,存放在/etc/kubernetes/pki目錄中。
  5. [kubeconfig] :生成 KubeConfig文件,存放在/etc/kubernetes目錄中,組件之間通信需要使用對應文件。
  6. [control-plane]:使用/etc/kubernetes/manifest目錄下的YAML文件,安裝 Master組件。
  7. [etcd]:使用/etc/kubernetes/manifest/etcd.yaml安裝Etcd服務。
  8. [wait-control-plane]:等待control-plan部署的Master組件啓動。
  9. [apiclient]:檢查Master組件服務狀態。
  10. [uploadconfig]:更新配置
  11. [kubelet]:使用configMap配置kubelet。
  12. [patchnode]:更新CNI信息到Node上,通過註釋的方式記錄。
  13. [mark-control-plane]:爲當前節點打標籤,打了角色Master,和不可調度標籤,這樣默認就不會使用Master節點來運行Pod。
  14. [bootstrap-token]:生成token記錄下來,後邊使用kubeadm join往集羣中添加節點時會用到
  15. [addons]:安裝附加組件CoreDNS和kube-proxy

成功執行之後,你會看到下面的輸出

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.9.30:6443 --token lwnslb.ks2sx9uulokawwzg \
    --discovery-token-ca-cert-hash sha256:2960d2259c63f3422dcf8958279b85fb74050a201a879924cd6eaeeb697bc1d6 

$HOME/.kube/config

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: xx=
    server: https://192.168.9.30:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: xxx=
    client-key-data: xxx==

查看下載的鏡像文件

 ~]# docker images
REPOSITORY                   TAG       SIZE
xx/kube-proxy                v1.16.3   86.1MB   # 
xx/kube-apiserver            v1.16.3   217MB    # apiserver
xx/kube-controller-manager   v1.16.3   163MB    # 控制器
xx/kube-scheduler            v1.16.3   87.3MB   # 調度器
xx/etcd                      3.3.15-0  247MB    # 配置相關
xx/coredns                   1.6.2     44.1MB   # dns
xx/pause                     3.1       742kB    # 基礎鏡像

如果執行失敗,那意味着之前的操作存在問題,檢查順序如下:

  • 基礎環境

  • 主機名是否可以解析,SELinux,iptables是否關閉。

  • 交換分區是否存在free -m查看

  • 內核參數是否修改、IPVS是否修改(目前階段不會造成失敗)

  • 基礎軟件

  • Docker是否安裝並啓動

  • Kubelet是否安裝並啓動

  • 執行kubeadm是否有別的報錯是否忽略

  • systemctl status kubelet查看kubelet是否啓動

  • 如果kubelet無法啓動,查看日誌有什麼報錯,並解決報錯。

  • 以上都解決完畢,需要重新初始化

  • **kubeadm reset 進行重置(**生產千萬不要執行,會直接刪除集羣)

  • 根據kubeadm reset 提升,清楚iptables和LVS。

查看節點狀態

 ~]# kubectl get nodes   # 查看集羣節點
NAME            STATUS     ROLES    AGE   VERSION
docker-master   NotReady   master   61m   v1.16.3
flannel

基礎網絡組件 github地址

# 安裝flannel清單,  所有節點都需要安裝
For Kubernetes v1.7+ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 有時候會出現 The connection to the server raw.githubusercontent.com was refused,可能是地址被污染了可以在 /etc/hosts中  來源:https://www.jianshu.com/p/5c1a352ba242
~]# cat /etc/hosts # 添加解析記錄在進行下載
    199.232.28.133 raw.githubusercontent.com

 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    podsecuritypolicy.policy/psp.flannel.unprivileged created
    clusterrole.rbac.authorization.k8s.io/flannel created
    clusterrolebinding.rbac.authorization.k8s.io/flannel created
    serviceaccount/flannel created
    configmap/kube-flannel-cfg created
    daemonset.apps/kube-flannel-ds-amd64 created
    daemonset.apps/kube-flannel-ds-arm64 created
    daemonset.apps/kube-flannel-ds-arm created
    daemonset.apps/kube-flannel-ds-ppc64le created
    daemonset.apps/kube-flannel-ds-s390x created

# 查看docker images
	quay.io/coreos/flannel       v0.11.0-amd64 

# 檢查 nodes
 ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   12m   v1.16.3
kubectl簡單使用
~]# kubectl get cs
    NAME                 AGE
    scheduler            <unknown>
    controller-manager   <unknown>
    etcd-0               <unknown>
#從1.16開始就顯示爲unknow 具體原因:https://segmentfault.com/a/1190000020912684

# 臨時解決方案
 ~]# kubectl get cs -o=go-template='{{printf "|NAME|STATUS|MESSAGE|\n"}}{{range .items}}{{$name := .metadata.name}}{{range .conditions}}{{printf "|%s|%s|%s|\n" $name .status .message}}{{end}}{{end}}'
|NAME|STATUS|MESSAGE|
|controller-manager|True|ok|
|scheduler|True|ok|
|etcd-0|True|{"health":"true"}|

~]# kubectl get ns    #  查看k8s 名稱空間
NAME              STATUS   AGE
default           Active   71m
kube-node-lease   Active   71m
kube-public       Active   71m
kube-system       Active   71m

 ~]# kubectl get pods -n kube-system  # 查看系統運行的pod
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-58cc8c89f4-lskfh                1/1     Running   0          71m
coredns-58cc8c89f4-xx5gj                1/1     Running   0          71m
etcd-docker-master                      1/1     Running   0          70m
kube-apiserver-docker-master            1/1     Running   0          70m
kube-controller-manager-docker-master   1/1     Running   0          70m
kube-flannel-ds-amd64-5p7gs             1/1     Running   0          6m59s
kube-proxy-lbvkn                        1/1     Running   0          71m
kube-scheduler-docker-master            1/1     Running   0          70m

 ~]# kubectl get deployment   # 查看運行容器的使用情況 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           7m20s

2.4、加入集羣

~]#  kubeadm join 192.168.9.30:6443 --token lwnslb.ks2sx9uulokawwzg \
>     --discovery-token-ca-cert-hash sha256:2960d2259c63f3422dcf8958279b85fb74050a201a879924cd6eaeeb697bc1d6

[preflight] Running pre-flight checks
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver isthe guide at https://kubernetes.io/docs/setup/cri/
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.5. Lates
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-sys
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

 ~]# docker images   # 加入集羣后會自動下載 
REPOSITORY                                           TAG                    registry.aliyuncs.com/google_containers/kube-proxy   v1.16.3        
quay.io/coreos/flannel                               v0.11.0-amd64  
registry.aliyuncs.com/google_containers/pause        3.1            

3、CURD

查看

~]# kubectl get nodes   # 如果roles爲none但的確加入集羣了是因爲沒有加入flannel網絡
NAME     STATUS     ROLES    AGE   VERSION
master   Ready      master   30m   v1.16.3
node1    Ready     <none>   12s   v1.16.3
node2    Ready      <none>   14s   v1.16.3

# CrashLoopBackOff 如果有這個backoff那就多等會, 可能是因爲網絡問題flannel沒下載
~]# kubectl get pods -n kube-system -o wide
NAME                             READY   STATUS    RESTARTS IP             NODE  
coredns-58cc8c89f4-dtfqg         1/1     Running   0        10.244.0.3     master
coredns-58cc8c89f4-vj6px         1/1     Running   0        10.244.0.2     master
etcd-master                      1/1     Running   0        192.168.9.30   master
kube-apiserver-master            1/1     Running   0        192.168.9.30   master
kube-controller-manager-master   1/1     Running   0        192.168.9.30   master
kube-flannel-ds-amd64-8b2m8      1/1     Running   0        192.168.9.31   node1 
kube-flannel-ds-amd64-xgrqw      1/1     Running   0        192.168.9.30   master
kube-flannel-ds-amd64-xh8mw      1/1     Running   0        192.168.9.32   node2 
kube-proxy-f8f7w                 1/1     Running   0        192.168.9.32   node2 
kube-proxy-qs98x                 1/1     Running   0        192.168.9.30   master
kube-proxy-v6b7x                 1/1     Running   0        192.168.9.31   node1 
kube-scheduler-master            1/1     Running   0        192.168.9.30   master

~]# kubectl describe node slave1   # 查看節點的狀態信息
命令 說明
kubectl get pod 查看所有的pod信息
kubectl get pod -o wide 查看更詳細的pod狀態說明
kubectl get pod --show-labels 查看pod的標籤屬性
kubectl get deployment 查看pod的控制器狀態
kubectl describe node name 查看該節點的狀態詳細說明
kubectl version 查看k8s版本
kubectl cluster-info 查看k8s集羣

名稱空間

  • 查看名稱空間

    ~]# kubectl get namespaces
        NAME STATUS AGE
        default Active 108m # 沒有指明名稱空間下都在default
        kube-node-lease Active 108m 
        kube-public Active 108m # 公共的,任何人都可以訪問的
        kube-system Active 108m # 系統級的Pod都運行在這個空間下
    
  • 創建名稱空間

]# kubectl api-resources  # 查看可以創建的資源

]# kubectl create namespace qa  # 創建一個名稱空間資源

]# kubectl delete namespace qa  # 刪除一個名稱空間

]# kubectl get namespaces default -o json   # 查看名稱空間的信息 json格式

]# kubectl describe namespaces default   # 查看名稱空間的描述

創建pod

  • 創建pod
# 運行名稱爲nginx  鏡像來源於 nginx  --replicas定義使用幾個副本
~]# kubectl run nginx --image=nginx:latest --replicas=1 

# 1.18版本需要直接創建
~]# kubectl create  deployment nginx-deploy --image=nginx
  • 查看創建的pod
 ~]# kubectl  get pods
NAME                           READY   STATUS    RESTARTS   AGE  IP          NODE
nginx-deploy-d4789f999-nmp4m   1/1     Running   0          18m  10.244.2.4   slave2

 ~]# kubectl  get deployment nginx-deploy -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
nginx-deploy   1/1     1            1           18m   nginx        nginx    app=nginx-deploy
# 名稱   準備就緒1個  最新1個  活躍1個   活躍時長  容器名稱   鏡像nginx  控制器選擇標籤

# 查看pod的創建詳細信息
~]# kubectl  describe pod nginx-deploy-d4789f999-nmp4m

# 查看控制器創建詳細信息
~]# kubectl  describe deployment nginx-deploy
    Name:                   nginx-deploy
    Namespace:              default
    CreationTimestamp:      Wed, 08 Apr 2020 11:53:57 +0800
    Labels:                 app=nginx-deploy
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=nginx-deploy
    Replicas:               1 desired | 1 updated | 1 總 | 1 活 | 0 不活躍
    StrategyType:           RollingUpdate
  • 創建的pod不屬於docker0橋,而是屬於cni0橋,在節點中的所有機器都能直接訪問pod資源,集羣外部的機器都是不可訪問的。

pods的客戶端有兩類

  1. 其它pod: 集羣內的客戶端與服務端
  2. 集羣外部的客戶端:需要靠特殊的service才能訪問

刪除容器

# 當直接刪除一個容器時,控制器會在重新build一個pod
 ~]# kubectl delete pod nginx-6db489d4b7-kqd87
pod "nginx-6db489d4b7-kqd87" deleted

 ~]# kubectl get pods  # 如果狀態一直不成功 說明下載鏡像可能出現了問題
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6db489d4b7-sghbn   1/1     Running   0          2m34s

# 徹底刪除不在恢復
 ~]#   kubectl delete deployment iapp
deployment.apps "iapp" deleted
  • 假設 A pod正在運行,誤操作刪除會重新生成了B pod 那麼機器就無法訪問了, 其pod地址|名稱會隨時發生改變,因此應該給它一個固定端點,後續客戶端訪問時直接訪問其固定端點即可,固定端點由service提供
  • 固定端點: kubectl expose, 直接將expose端口轉發至pod服務如: nginx

4、service

類型(type) 說明
ClusterIP service只有一個service ip,只能在集羣內被pod各客戶端所訪問,
而不能突破集羣邊境被集羣外的客戶端所訪問, 默認類型
NodePort 集羣外節點訪問,30030-31325
LoadBalancer
ExternalName
# 使用語法:  kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP][--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type][options]e

# 將這個控制器的pod資源創建爲一個服務, 添加端點
 ~]# kubectl expose deployment nginx --name nginx --port=80 --protocol=TCP --target-port=80 
service/nginx exposed

 ~]# kubectl get services    #查看創建的 expose 固定訪問端點地址 簡寫: services = svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx        ClusterIP   10.97.222.101   <none>        80/TCP    19s
# 注意:  此時地址默認爲 ClusterIP類型, 還是隻能在集羣內訪問

# 此時架構爲:   service_ip:service:port 代理nginx_pod服務 pod_ip:pod_port

# 刪除端點
~]# kubectl delete svc nginx

查看coreDns

通過coreDNS解析nginx,以便直接通過nginx訪問expose服務

~]# kubectl get svc -o wide -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   4h57m   k8s-app=kube-dns

pod端點訪問

  1. 創建客戶端

    # 創建一個pod客戶端, 測試expose端點服務以及coreDns
     ~]#  kubectl run client  --image=busybox --rm -it 
    / # cat /etc/resolv.conf 
    nameserver 10.96.0.10   # dns地址爲 coreDns
    # 搜索域,如果需要在節點內解析nginx那就需要加上   nginx.default.svc.cluster.local
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    
  2. 訪問nginx

/ # wget nginx     # 此時會自動解析成爲 expose地址
Connecting to nginx (10.97.222.101:80)
  1. 刪除pods在重新訪問
 ~]# kubectl delete pods nginx-6db489d4b7-sghbn
pod "nginx-6db489d4b7-sghbn" deleted

# 此時在查看pods 已經成 node1 切換爲 node2
# 通過標籤或標籤選擇器關連pod資源, 而不用基於地址來選擇, 無論後臺怎麼變化它只要屬於deployment,那就全部會納入到資源中, 通過端點就無需在關注pods了

# 在到client中訪問依舊沒問題
/ # wget -O - -q http://nginx
    <title>Welcome to nginx!</title>
  1. 後端狀態
# 無論 pods運行在哪個節點, expose 服務通過iptables或ipvs規則把所有訪問這個pods的資源通過label| select  都調度至後端的pods

 ~]# kubectl describe service nginx
Name:              nginx
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx	  # 2、只要發現pod有這個標籤就會立即加入到這個池中
Type:              ClusterIP
IP:                10.97.222.101    # 3、expose訪問地址
Port:              <unset>  80/TCP  # 3、訪問端口
TargetPort:        80/TCP           # 4、pod_target端口
Endpoints:         10.244.2.3:80   # 1、如果刪除pods這個地址會立即發生改變 
Session Affinity:  None
Events:            <none>

# 查看labels, 當這個標籤刪除,只要有新的生成,攜帶該標籤就會立即加入到 expose 池中
 ~]# kubectl get pods --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-6db489d4b7-qqhqs   1/1     Running   0          14m   pod-template-hash=6db489d4b7,run=nginx

demo

  1. 創建控制器生成pod 關鍵字: kubectl run
# 生成五個pods, 控制器名 iapp
~]# kubectl run iapp --image=ikubernetes/myapp:v1 --replicas=5

~]# kubectl get pods -o wide  # 確保全部爲running狀態
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE  
iapp-7665f799d7-5mwrx    1/1     Running   0          71s   10.244.2.9    node2 
iapp-7665f799d7-gmvm9    1/1     Running   0          71s   10.244.1.9    node1 
iapp-7665f799d7-lr44m    1/1     Running   0          71s   10.244.2.8    node2 
iapp-7665f799d7-q4fck    1/1     Running   0          71s   10.244.1.8    node1 
iapp-7665f799d7-vhttb    1/1     Running   0          71s   10.244.1.10   node1 
  1. 創建端點 關鍵字: kubectl exposed
~]# kubectl expose deployment iapp --name=iapp --port=80 --target-port=80 
    service/iapp exposed

~]# kubectl get svc    # 確保端點正常
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    iapp         ClusterIP   10.102.128.15   <none>        80/TCP    12s

 ~]# kubectl describe svc iapp
Name:              iapp
Namespace:         default
Labels:            run=iapp
Annotations:       <none>
Selector:          run=iapp    # 標籤爲 run=iapp
Type:              ClusterIP
IP:                10.102.128.15
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.10:80,10.244.1.8:80,10.244.1.9:80 + 2 more...
  1. 通過pod客戶端訪問端點, 測試輪詢
# wget iapp  # 還是busybox的客戶端, 先檢查是否能解析
	Connecting to iapp (10.102.128.15:80)

# 訪問iapp端點的確是通過iptables策略輪詢訪問
/ # while true;do wget -O - -q http://iapp/hostname.html; sleep 1; done
iapp-7665f799d7-q4fck
iapp-7665f799d7-5mwrx
iapp-7665f799d7-lr44m
iapp-7665f799d7-gmvm9
  1. 減少pods 關鍵字: kubectl scale
# current-replicas 當前有多少pod可忽略, 直接修改即可
# If the deployment named mysql's current size is 2, scale mysql to 3.
#   kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

~]# kubectl scale --replicas=3 deployment iapp
    deployment.apps/iapp scaled   # 再次查看就只有三個了
  1. 增加pods kubectl scale --replicas=5 deployment iapp

  2. 升級版本 關鍵字: 服務修改:kubectl set image 狀態查看:kubectl rollout

# 1、查看某一臺的pods詳細信息
~]# kubectl describe pods iapp-7665f799d7-gmvm9   
Name:         iapp-7665f799d7-gmvm9
Namespace:    default
Priority:     0
Node:         node1/192.168.9.31
Start Time:   Thu, 28 Nov 2019 16:49:18 +0800
Labels:       pod-template-hash=7665f799d7
              run=iapp
Annotations:  <none>
Status:       Running
IP:           10.244.1.9
IPs:
  IP:           10.244.1.9
Containers:
  iapp:
    Container ID:   docker://idididididd
    Image:          ikubernetes/myapp:v1     # 2、當前版本爲v1

# 語法:  set image 控制器 名稱   iapp是 containers的iapp名稱=這裏是鏡像
 ~]# kubectl set image deployment iapp iapp=ikubernetes/myapp:v2
    deployment.apps/iapp image updated

# 檢查正在rollout的狀態
~]# kubectl rollout status deployment iapp
Waiting for deployment "iapp" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "iapp" rollout to finish: 4 of 5 updated replicas are available...
deployment "iapp" successfully rolled out

# 再次檢查pods 會發現name已全部更換
 ~]# kubectl describe pods iapp-7bf86c5d78-mj7hq
Node:         node2/192.168.9.32
Labels:       pod-template-hash=7bf86c5d78
              run=iapp
Containers:
  iapp:
    Container ID:   docker://ididididididid
    Image:          ikubernetes/myapp:v2
  1. 回滾

    1. 修改版本回歸 kubectl set image deployment iapp iapp=ikubernets/myapp:v1

    2. 撤銷上一次的rollout

       ~]# kubectl rollout undo deployment iapp
          deployment.apps/iapp rolled back
      
    3. 查看歷史記錄 kubectl rollout history deployment iapp

  2. 修改服務端點

     ~]# kubectl edit svc iapp
    service/iapp edited
    	# 將類型修改爲: type: NodePort   
    	
    # 檢查k8s服務狀態
     ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    iapp         NodePort    10.102.128.15   <none>        80:30219/TCP   24m
    
    # 修改爲: NodePort 就能在外網通過集羣主機端口訪問了
    # http://192.168.9.30:30219/   集羣地址30219  
    

總結

	API Server對於Kubernetes至關重要,你的所有操作,都只能且必須經過API Server,所有其他組件包括控制器管理器、Scheduler都必須只能與API Server進行交互,所以API Server是整個Kubernetes,也只有API Server才能去操作etcd中的數據,kubelet或kube-proxy都需要與API Server進行交互,他們也都是API Server的客戶端,他們都必須認證到API Server中才能進行操作,API Server也是唯一一個etcd的客戶端,也就意味着能管理或操作etcd集羣的也只有API Server,所以etcd被稱爲cluster store整個集羣的所有資源的狀態定義的信息都保存在etcd當中,所以etcd如果崩了,那麼整個集羣的過去的運行記錄都沒了;
	所以作爲運維工程師來講,我們應當定期去備份etcd當中的數據,並且爲了保障etcd的可用,應該把etcd做成高可用的,API Server自身作爲整個集羣的網關,我們與API Server打交道的時候可以使用客戶端命令工具kubectl,以後還有一個dashboard可以實現圖形化操作,Kubernetes的API是一個http的API, 默認使用json格式的數據,我們在使用http協議提交配置的時候,也是使用的json,即使我們提交的是一個yaml,它還是會自動轉化爲json,所以唯一接收的序列化方案是json;
	API Server是一個resetfull風格的API,在resetfull風格中,reset叫做表徵狀態轉移,它是一種架構範式,是一種能讓分佈式組件之間能夠互相調用的一種範式;
	對於我們的Kubernetes來講,不論有多少種不同類型的資源,最後事實上他們都應該位於整個API Server的某個API版本下,比如Service改變了,如果大家都依賴於這個Service那麼整個API Server所有版本都得變更,所以Kubernetes把它的API Server把它的API分解到了不同的羣組當中,其中每個組合組合通常都是一組相關的類型,我們稱爲API Group羣組,這些羣組可以使用kubectl api-versions來查看,v1是核心羣組,並且多版本可以並存,所以你的每一個資源一定是某個羣組下的一組運行的屬性賦值,不同的版本相同的羣組他的屬性是不一樣的,所以假如你在v1下面定義一個資源在v1beta1下面未必有用;
kubectl get deployments.apps myweb -o json該命令執行後可以看到apiVersion是apps/v1

etcd被稱爲cluster store整個集羣的所有資源的狀態定義的信息都保存在etcd當中,所以etcd如果崩了,那麼整個集羣的過去的運行記錄都沒了;
所以作爲運維工程師來講,我們應當定期去備份etcd當中的數據,並且爲了保障etcd的可用,應該把etcd做成高可用的,API Server自身作爲整個集羣的網關,我們與API Server打交道的時候可以使用客戶端命令工具kubectl,以後還有一個dashboard可以實現圖形化操作,Kubernetes的API是一個http的API, 默認使用json格式的數據,我們在使用http協議提交配置的時候,也是使用的json,即使我們提交的是一個yaml,它還是會自動轉化爲json,所以唯一接收的序列化方案是json;
API Server是一個resetfull風格的API,在resetfull風格中,reset叫做表徵狀態轉移,它是一種架構範式,是一種能讓分佈式組件之間能夠互相調用的一種範式;
對於我們的Kubernetes來講,不論有多少種不同類型的資源,最後事實上他們都應該位於整個API Server的某個API版本下,比如Service改變了,如果大家都依賴於這個Service那麼整個API Server所有版本都得變更,所以Kubernetes把它的API Server把它的API分解到了不同的羣組當中,其中每個組合組合通常都是一組相關的類型,我們稱爲API Group羣組,這些羣組可以使用kubectl api-versions來查看,v1是核心羣組,並且多版本可以並存,所以你的每一個資源一定是某個羣組下的一組運行的屬性賦值,不同的版本相同的羣組他的屬性是不一樣的,所以假如你在v1下面定義一個資源在v1beta1下面未必有用;
kubectl get deployments.apps myweb -o json該命令執行後可以看到apiVersion是apps/v1

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