k8s系統架構 從系統架構來看,k8s分為2個節點 Master 控制節點 指揮官 Node 工作節點 幹活的 1.Master節點組成 API Server :提供k8s API介面 主要處理Rest操作以及更新Etcd中的對象 是所有資源增刪改查的唯一入口。 Scheduler:資源調度器 根據 ...
k8s系統架構
從系統架構來看,k8s分為2個節點
Master 控制節點 指揮官
Node 工作節點 幹活的
1.Master節點組成
API Server :提供k8s API介面
主要處理Rest操作以及更新Etcd中的對象
是所有資源增刪改查的唯一入口。
Scheduler:資源調度器
根據etcd里的節點資源狀態決定將Pod綁定到哪個Node上
Controller Manager
負責保障pod的健康存在
資源對象的自動化控制中心,Kubernetes集群有很多控制器。
Etcd
這個是Kubernetes集群的資料庫
所有持久化的狀態信息存儲在Etcd中
master節點組成
API相當於命令,溝通API server
2.Node節點的組成
Docker Engine
負責節點容器的管理工作,最終創建出來的是一個Docker容器。
kubelet
安裝在Node上的代理服務,用來管理Pods以及容器/鏡像/Volume等,實現對集群對節點的管理。
kube-proxy
安裝在Node上的網路代理服務,提供網路代理以及負載均衡,實現與Service通訊。
node節點組成
k8s邏輯架構
從邏輯架構上看,k8s分為
Pod
Controller
Service
1.POD
POD是k8s的最小單位
POD的IP地址是隨機的,刪除POD會改變IP
POD都有一個根容器
一個POD內可以由一個或多個容器組成
一個POD內的容器共用根容器的網路命名空間
一個POD的內的網路地址由根容器提供
2.Controller
用來管理POD
控制器的種類有很多
- RC Replication Controller 控制POD有多個副本
- RS ReplicaSet RC控制的升級版
- Deployment 推薦使用,功能更強大,包含了RS控制器
- DaemonSet 保證所有的Node上有且只有一個Pod在運行
- StatefulSet 有狀態的應用,為Pod提供唯一的標識,它可以保證部署和scale的順序
3.Service
NodeIP
CluterIP
POD IP
DaemonSet
三個不通的ip
k8s安裝
手動安裝
https://www.kubernetes.org.cn/3096.html
涉及的命令
ipvsadm -Ln #查看ipvs規則
kubectl get pod #查看pod信息
kubectl get pod -o wide #查看pod的詳細信息 ip labels
kubectl get pod -n kube-system -o wide #指定查看某個命名空間的pod的詳細信息
kubectl get nodes #查看節點信息
kubectl get nodes -o wide #查看節點詳細信息
kubectl -n kube-system edit cm kube-proxy #編輯某個資源的配置文件
kubectl -n kube-system logs -f kube-proxy-7cdbn #查看指定命名空間里的指定pod的日誌
kubectl create -f kube-flannel.yml #根據資源配置清單創建相應的資源
kubectl delete -f kube-flannel.yml #刪除資源配置清單相應的資源
kubeadm reset #重置kubeadm節點
kubeadm token create --print-join-command #列印出node節點加入master節點的命令
kubeadm join 10.0.0.11:6443 --token uqf018.mia8v3i1zcai19sj --discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae #node節點加入master的命令
實驗環境準備:
配置信息:
主機名 IP地址 推薦配置 勉強配置
node1 10.0.0.11 1C4G40G 1C2G
node2 10.0.0.12 1C2G40G 1C1G
node3 10.0.0.13 1C2G40G 1C1G
初始化操作:
乾凈環境
關閉防火牆
關閉SELinux
配置時間同步
配置主機名
配置host解析
更新好阿裡源
確保網路通暢
軟體準備:
harbor離線包
1.防火牆關閉
iptables -nL
systemctl disable firewalld && systemctl stop firewalld
iptables -F
iptables -X
iptables -Z
iptables -nL
2.selinux關閉
getenforce
grep "disabled" /etc/selinux/config
setenforce 0
3.同不定時任務
* * * * * /sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
4.臨時關閉swap分區
swapoff -a
永久關閉
sed -ri 's/.*swap.*/#&/' /etc/fstab
安裝部署docker
1.設置國內YUM源
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安裝指定的docker版本
yum -y install docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7
3.設置docker使用阿裡雲加速
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
4.啟動後臺進程
systemctl enable docker && systemctl start docker
5.查看docker版本
docker -v
部署kubeadm和kubelet
部署kubeadm和kubelet
註意!所有機器都需要操作!!!
註意!所有機器都需要操作!!!
註意!所有機器都需要操作!!!
1.設置k8s國內yum倉庫
cat >/etc/yum.repos.d/kubernetes.repo<<EOF
[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
2.安裝kubeadm
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
3.設置k8s禁止使用swap
cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
4.設置內核參數
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
5.設置kubelet開機啟動
systemctl enable kubelet && systemctl start kubelet
6.載入IPVS模塊
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv
node1節點初始化
1.初始化命令
https://v1-16.docs.kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
註意!只在node1節點運行!!!
註意!只在node1節點運行!!!
註意!只在node1節點運行!!!
kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
執行完成後會有輸出,這是node節點加入k8s集群的命令
===============================================
kubeadm join 10.0.0.11:6443 --token 2an0sn.kykpta54fw6uftgq \
--discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae
===============================================
2.為kubectl準備kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.獲取node節點信息
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 NotReady master 15m v1.16.
4.支持命令補全
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash >/etc/bash_completion.d/kubectl
5.設置kube-proxy使用ipvs模式
#執行命令,然後將mode: ""修改為mode: "ipvs"然後保存退出
kubectl edit cm kube-proxy -n kube-system
#重啟kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
#查看pod信息
kubectl get -n kube-system pod|grep "kube-proxy"
#檢查日誌,如果出現IPVS rr就表示成功
[root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-7cdbn
I0225 08:03:57.736191 1 node.go:135] Successfully retrieved node IP: 10.0.0.11
I0225 08:03:57.736249 1 server_others.go:176] Using ipvs Proxier.
W0225 08:03:57.736841 1 proxier.go:420] IPVS scheduler not specified, use rr by default
#檢查IPVS規則
[root@node1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr
-> 10.0.0.11:6443 Masq 1 0 0
TCP 10.1.0.10:53 rr
TCP 10.1.0.10:9153 rr
UDP 10.1.0.10:53 rr
顯示結果如下,安裝成功
kubeadm join 10.0.0.11:6443 --token ahpc8m.eo6crouhvqw5p8e3 \
--discovery-token-ca-cert-hash sha256:b02959c21fddd87430985c7ee3a421c5c81c8d57434e258891a07f1b7faec543
為什麼刪除kube-proxy
node1部署網路插件
部署網路插件
1.部署Flannel網路插件
git clone --depth 1 https://github.com/coreos/flannel.git
2.修改資源配置清單
cd /root/flannel-master/Documentation
vim kube-flannel.yml
egrep -n "10.2.0.0|mirror|eth0" kube-flannel.yml
128: "Network": "10.2.0.0/16",
172: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
186: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
192: - --iface=eth0 #新增加
3.應用資源配置清單
kubectl create -f kube-flannel.yml
4.檢查pod運行狀態,等一會應該全是running
[root@node1 ~]# kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-bzlkw 1/1 Running 0 77m
coredns-58cc8c89f4-sgs44 1/1 Running 0 77m
etcd-node1 1/1 Running 0 76m
kube-apiserver-node1 1/1 Running 0 76m
kube-controller-manager-node1 1/1 Running 0 76m
kube-flannel-ds-amd64-cc5g6 1/1 Running 0 3m10s
kube-proxy-7cdbn 1/1 Running 0 23m
kube-scheduler-node1 1/1 Running 0 76m
修改錯配置文件
解決辦法:
查看pod信息
kubectl get -n kube-system pod|grep "kube-proxy"
kubectl -n kube-system logs -f +pod對應的信息
503報錯
防火牆沒關
在目錄里操作:
第一步 kubectl delete -f kube-flannel.yml
第二步 cp kube-flannel.yml /opt
第三部 rm -rf kube-flannel.yml
然後把老師拖進來任意目錄下
最後執行kubectl create -f kube-flannel.yml
查看kubectl -n kube-system get pod
node2-3節點執行
1.在master節點上輸出增加節點的命令
kubeadm token create --print-join-command
2.在node2和node3節點執行加入集群的命令 每個人的token不一樣
kubeadm join 10.0.0.11:6443 --token uqf018.mia8v3i1zcai19sj --discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae
3.在node1節點上查看狀態
kubectl get nodes
4.給其他節點打標簽
kubectl label nodes node2 node-role.kubernetes.io/node=
kubectl label nodes node3 node-role.kubernetes.io/node=
5.再次查看節點狀態
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 171m v1.16.2
node2 Ready node 27m v1.16.2
node3 Ready node 27m v1.16.2
常用資源類型
1.工作負載類型
RC ReplicaController
RS ReplicaSet
DP Deployment
DS DaemonSet
2.服務發現及負載均衡
Service
Ingress
3.配置與存儲資源
ConfigMap 存儲配置文件
Secret 存儲用戶字典
4.集群級別資源
Namespace
Node
Role
ClusterRole
RoleBinding
ClusterRoleBinding
資源配置清單
1.創建資源的方法
apiserver僅能接受json格式的資源定義
yaml格式提供的清單,apiserver可以自動將其轉換為json格式再提交
2.資源清單介紹
查看資源清單所需欄位
kubectl explain pod
資源清單欄位介紹
apiVersion: v1 #屬於k8s哪一個API版本或組
kind: Pod #資源類型
metadata: #元數據,嵌套欄位
spec: #定義容器的規範,創建的容器應該有哪些特性
status: #只讀的,由系統控制,顯示當前容器的狀態
json嵌套
{ 1級:
{ 2級:
{ 3級:Value
}
}
}
3.查看資源清單嵌套的命令
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.volumes
4.使用命令行創建一個pod
kubectl create deployment nginx --image=nginx:alpine
kubectl get pod -o wide
5.將剛纔創建的pod配置到處成yaml格式
kubectl get pod -o yaml > nginx-pod.yaml
精簡資源清單,刪掉不需要的配置
cat nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
json格式寫法:
{
apiVersion: "v1",
kind: "Pod",
metadata:
{
name: "nginx",
labels:
{
app: "nginx"
}
}
spec:
{
containers:
{
name: "nginx",
image: "nginx:alpine",
imagePullPolicy: "IfNotPresent"
}
}
}
刪除命令行創建的資源
kubectl delete deployments.apps nginx
應用資源配置清單
kubectl create -f nginx-pod.yaml
查看pod信息
kubectl get pod -o wide
查看pod詳細信息
kubectl describe pod nginx
6.POD資源清單總結
聲明式管理 我想運行一個Nginx k8s幫你幹活
apiVersion: v1 #api版本
kind: Pod #資源類型
metadata: #元數據
name: nginx #元數據名稱
labels: #pod標簽
app: nginx
spec: #容器定義
containers: #容器的特性
- name: nginx #容器名稱
image: nginx:alpine #容器的鏡像名稱
imagePullPolicy: IfNotPresent #容器的拉取策略
ports: #容器埠
- name: http
containerPort: 80 #容器暴露的埠
升級版本
改變資源配置清單版本
image: "nginx:alpine",
執行
kubectl apply -f nginx-pod.yaml
容器打標簽
1.標簽說明
一個標簽可以給多個POD使用
一個POD也可以擁有多個標簽
2.查看POD標簽
kubectl get pod --show-labels
3.添加標簽方法
方法1:直接編輯資源配置清單:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
release: beta
----------------------
方法2:命令行打標簽
kubectl label pods nginx release=beta
kubectl label pods nginx job=linux
kubectl get pod --show-labels
4.刪除標簽
kubectl label pod nginx job-
kubectl get pod --show-labels
5.實驗: 生成2個POD,打上不同的標簽,然後根據標簽選擇
kubectl create deployment nginx --image=nginx:1.14.0
kubectl get pod --show-labels
kubectl label pods nginx-xxxxxxxx release=stable
kubectl get pod --show-labels
根據條件查看
kubectl get pods -l release=beta --show-labels
kubectl get pods -l release=stable --show-labels
根據條件刪除
kubectl delete pod -l app=nginx
Node打標簽
Node打標簽
1.查看node的標簽
kubectl get node --show-labels
2.給node打標簽
kubectl label nodes node2 CPU=Xeon
kubectl label nodes node3 disktype=ssd
3.編輯POD資源配置清單,使用node標簽選擇器
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
nodeSelector:
#CPU: Xeon
disktype: SSD
4.刪除容器重新創建
kubectl delete pod nginx
kubectl create -f nginx-pod.yaml
5.查看結果
kubectl get pod -o wide
6.刪除節點標簽
部署harbor作為k8s鏡像倉庫
部署harbor作為k8s鏡像倉庫
1.實驗目標
部署k8s私有鏡像倉庫harbor
把demo小項目需要的鏡像上傳到harbor上
修改demo項目的資源配置清單,鏡像地址修改為harbor的地址
2.在node1上安裝harbor
cd /opt/
tar zxf harbor-offline-installer-v1.9.0-rc1.tgz
cd harbor/
3.編輯harbor配置文件
vim harbor.yml
hostname: 10.0.0.11
port: 8888
harbor_admin_password: 123456
data_volume: /data/harbor
4.執行安裝
yum install docker-compose -y
./install.sh
5.瀏覽器訪問
http://10.0.0.11:8888
admin
123456
6.建立鏡像倉庫
這裡有2種訪問級別:
公開:任何人都可以直接訪問並下載鏡像
私有:登陸授權後才允許下載鏡像
如果創建私有倉庫,k8s是不能直接下載的,需要配置安全文件
7.所有節點都配置docker信任harbor倉庫並重啟docker
cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries" : ["http://10.0.0.11:8888"]
}
EOF
systemctl restart docker
###############註意###############
在node1上重啟docker後,如果harbor不正常了,重啟harbor即可
cd /opt/harbor
docker-compose restart
8.docker登陸harbor
docker login 10.0.0.11:8888
admin
123456
9.在相對的節點上下載鏡像修改tag並push到harbor上
查看節點分佈
kubectl get pods -o wide
在node2上執行
docker login 10.0.0.11:8888
docker tag kubeguide/tomcat-app:v1 10.0.0.11:8888/k8s/tomcat-app:v1
docker tag mysql:5.7 10.0.0.11:8888/k8s/mysql:5.7
docker push 10.0.0.11:8888/k8s/tomcat-app:v1
docker push 10.0.0.11:8888/k8s/mysql:5.7
10.節點上刪除鏡像
docker rmi mysql:5.7
docker rmi kubeguide/tomcat-app:v1
docker rmi 10.0.0.11:8888/k8s/mysql:5.7
docker rmi 10.0.0.11:8888/k8s/tomcat-app:v1
11.node1節點刪除以前的demo項目
kubectl delete -f tomcat-demo.yaml
12.修改demo項目的資源配置清單里的鏡像地址 直接第15開始
image: 10.0.0.11:8888/k8s/mysql:5.7
image: 10.0.0.11:8888/k8s/tomcat-app:v1
13.應用資源配置清單
kubectl create -f tomcat-demo.yaml
14.報錯
此時查看pod狀態會發現鏡像拉取失敗了
[root@node1 ~/demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-7d746b5577-jcs7q 0/1 ImagePullBackOff 0 8s
myweb-764df5ffdd-fptn9 0/1 ImagePullBackOff 0 8s
myweb-764df5ffdd-pmkz7 0/1 ErrImagePull 0 8s
查看pod創建的詳細信息
kubectl describe pod mysql-7d746b5577-jcs7q
關鍵報錯信息:
Failed to pull image "10.0.0.11:8888/k8s/mysql:5.7": rpc error: code = Unknown desc = Error response from daemon: pull access denied for 10.0.0.11:8888/k8s/mysql, repository does not exist or may require 'docker login'
15.查看docker登陸的密碼文件
docker login 10.0.0.11:8888
cat /root/.docker/config.json
16.將docker密碼文件解碼成base64編碼
[root@node1 ~/demo]# cat /root/.docker/config.json|base64
ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTE6ODg4OCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZN
VEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tl
ci1DbGllbnQvMTguMDkuOSAobGludXgpIgoJfQp9
17.創建並應用docker登陸的Secret資源(master節點執行)
註意!!!
1.dockerconfigjson: xxx直接寫base64的編碼,不需要換行
2.base64編碼是一整行,不是好幾行
3.最後的type欄位不能少
cat >harbor-secret.yaml<<EOF
apiVersion: v1
kind: Secret
metadata:
name: harbor-secret
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTE6ODg4OCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZNVEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuOSAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson
EOF
kubectl create -f harbor-secret.yaml
kubectl get secrets
18.修改demo資源配置清單,添加拉取鏡像的參數
查看命令幫助
kubectl explain deployment.spec.template.spec.imagePullSecrets
修改文件
image: 10.0.0.11:8888/k8s/mysql:5.7
image: 10.0.0.11:8888/k8s/tomcat-app:v1
----------------------------
imagePullSecrets:
- name: harbor-secret
添加兩處
----------------------------
19.應用資源配置清單並查看
kubectl create -f tomcat-demo.yaml
kubectl get pod -o wide
20.瀏覽器查看
http://10.0.0.11:30001/demo