部署
1、手動安裝
安裝: 都需要編譯或二進制安裝, 證書\網絡也需要手動安裝
master: API Serveer, Scheduler, Controller-manage, etcd 都需要當守護進程啓動,
node: kubelet, docker(或者說容器引擎), kube-proxy
2、kuberadm
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個步驟,每個階段均輸出均使用[步驟名稱]作爲開頭
- [init]:指定版本進行初始化操作
- [preflight] :初始化前的檢查和下載所需要的Docker鏡像文件。
- [kubelet-start]:生成kubelet的配置文件”/var/lib/kubelet/config.yaml”,沒有這個文件kubelet無法啓動,所以初始化之前的kubelet實際上啓動失敗。
- [certificates]:生成Kubernetes使用的證書,存放在/etc/kubernetes/pki目錄中。
- [kubeconfig] :生成 KubeConfig文件,存放在/etc/kubernetes目錄中,組件之間通信需要使用對應文件。
- [control-plane]:使用/etc/kubernetes/manifest目錄下的YAML文件,安裝 Master組件。
- [etcd]:使用/etc/kubernetes/manifest/etcd.yaml安裝Etcd服務。
- [wait-control-plane]:等待control-plan部署的Master組件啓動。
- [apiclient]:檢查Master組件服務狀態。
- [uploadconfig]:更新配置
- [kubelet]:使用configMap配置kubelet。
- [patchnode]:更新CNI信息到Node上,通過註釋的方式記錄。
- [mark-control-plane]:爲當前節點打標籤,打了角色Master,和不可調度標籤,這樣默認就不會使用Master節點來運行Pod。
- [bootstrap-token]:生成token記錄下來,後邊使用kubeadm join往集羣中添加節點時會用到
- [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的客戶端有兩類
- 其它pod: 集羣內的客戶端與服務端
- 集羣外部的客戶端:需要靠特殊的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端點訪問
-
創建客戶端
# 創建一個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
-
訪問nginx
/ # wget nginx # 此時會自動解析成爲 expose地址
Connecting to nginx (10.97.222.101:80)
- 刪除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>
- 後端狀態
# 無論 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
- 創建控制器生成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
- 創建端點 關鍵字:
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...
- 通過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
- 減少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 # 再次查看就只有三個了
-
增加pods
kubectl scale --replicas=5 deployment iapp
-
升級版本 關鍵字:
服務修改: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
-
回滾
-
修改版本回歸
kubectl set image deployment iapp iapp=ikubernets/myapp:v1
-
撤銷上一次的rollout
~]# kubectl rollout undo deployment iapp deployment.apps/iapp rolled back
-
查看歷史記錄
kubectl rollout history deployment iapp
-
-
修改服務端點
~]# 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