kubernetes學習筆記(一)
kubernetes簡介
? Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
? 在Kubernetes中,我們可以創建多個容器,每個容器里面運行一個應用實例,然后通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。
官方網站:https://kubernetes.io/
kubernetes特點
**自動化部署和擴展:**Kubernetes可以自動部署容器應用,并根據需要自動擴展或縮減應用實例的數量。
服務發現和負載均衡:Kubernetes提供了服務發現機制,使得容器中的應用可以容易地找到彼此并與之通信。同時,它支持內置的負載均衡,可以將流量分發到多個實例。
存儲編排:Kubernetes支持多種存儲系統,包括本地存儲、網絡存儲(如NFS、Ceph等),以及持久卷(Persistent Volumes),使得存儲的管理更加靈活和高效。
自動回滾和自我修復:如果應用實例失敗,Kubernetes可以自動重啟它們。此外,它還可以根據定義的策略自動回滾應用版本。
密鑰和配置管理:Kubernetes支持配置管理,允許應用以環境變量的形式或通過配置文件的方式獲取所需的配置信息。此外,它還支持密鑰管理,可以安全地存儲和管理敏感信息。
批處理和定時任務:Kubernetes支持批處理作業和定時任務,可以通過Cron Jobs等功能實現。
自我修復能力:Kubernetes能夠監控應用的狀態,并在節點故障或應用故障時自動采取措施(如重啟、替換實例等)。
可擴展性和靈活性:Kubernetes架構設計允許它在不同的基礎設施上運行(如物理機、虛擬機、公有云、私有云等),具有很高的可擴展性和靈活性。
社區和生態系統:Kubernetes擁有一個非常活躍的社區和生態系統,有大量的插件、工具和集成解決方案(如Helm、Istio、Prometheus等),可以滿足各種不同的需求。
安全性:Kubernetes提供了多層次的安全特性,包括網絡策略、角色基礎訪問控制(RBAC)、密鑰管理等,確保容器應用的安全性。
kubernetes安裝
在安裝kubernetes之前需要安裝docker。這里只提供centos安裝方式,其他平臺可以看前面docker的學習筆記。
centos官方安裝
#安裝一些系統必要的工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#添加軟件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查/etc/yum.repos.d/docker-ce.repo 中的ur[地址是不是都是阿里云的]
vi /etc/yum.repos.d/docker-ce.repo
# 如果不是,那么把download-stage.docker.com全部替換為mirrors。aliyun.com/docker-ce/#更新并安裝Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce#使用docker version可以看到client端的信息
docker version#啟動服務器再次使用docker version 就可以看到服務器端和客戶端的docker信息了
systemctl start docker
kubernetes集群規劃
? 這里是使用虛擬機去創建了3個centos7.5的主機。分別為其分配2h2g的資源。按理來說master節點的至少2h4g的資源。work節點至少需要1h2g的資源,但是由于電腦資源有限,所以就為每一個節點包括master節點2h2g的資源。至于磁盤的話20-30G就行了,當然資源肯定是越多越好了,也可以使用阿里云或者是其他云廠商的按需付費的云服務器(搶占式實例),實例按小時收費那種。做完實驗以后就可以回收停止付費,也是一種不錯的選擇,也還比較便宜。
這不介紹master和work的區別,我認為至少需要把集群搭起來,才能更好的學習kubernetes。
這里搭建的測試學習環境有太多的主觀因素,生產環境配置還請斟酌。
1、基礎環境
-
為每臺主機安裝kubelet、kubeadm、kubectl
-
節點之中不可以有重復的主機名、MAC 地址或 product_uuid。
-
開啟機器上的某些端口
-
禁用交換分區。為了保證 kubelet 正常工作,你必須禁用交換分區。
-
設置防火墻規則、設置不同的hostname、互信
2、虛擬機網絡配置
這里使用NAT模式的網絡,為其指定的私網網段是172.31.26.X如下
為master分配IP為172.31.26.3主機域名master,node01的IP為172.31.26.4主機域名node01,node02的IP為172.31.26.5主機域名node02
若是使用云主機以阿里云的ECS為例,可以在一下欄目去創建專有網絡,
在創建專有網絡時選擇IPV4,網段為172.16.0.0/16如下。
由于這個172.16.0.0/16這個網絡范圍太大可以有65536-2個主機地址,所以可以通過交換機進一步去劃分子網如下。
創建實例的時候選擇對應得專有網絡和交換機即可。
3、基礎環境設置
設置各個主機自己的主機名
hostnamectl set-hostname xxxx
#master節點 hostnamectl set-hostname master
#work節點hostnamectl set-hostname node01
將 SELinux 設置為 permissive 模式(SELinux仍然監控和記錄所有的安全違規事件,但不會強制執行任何拒絕操作。這意味著即使某些操作違反了策略,系統也會允許這些操作繼續進行,但是會在日志中記錄下來,但是有的教程說是必須把SELinux設置成disabled。有的說是 permissive就行。這里設置成permissive
sudo setenforce 0 #臨時關閉
sudo vi /etc/selinux/config #修改config如下 需重啟電腦生效
SELINUX=permissive
關閉swap分區,注釋/etc/fstab文件中所有swap分區相關的掛載配置
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
允許 iptables 檢查橋接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
安裝kubelet、kubeadm、kubectl,首先添加kubelet的yum源。
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOFsudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
systemctl enable --now kubelet#使用systemctl status kubelet查看時每隔幾秒就會重啟,因為它陷入了一個等待 kubeadm 指令的死循環
下載kubelet需要的鏡像,這里的鏡像地址是我阿里云的容器服務的地址,上面已經有kubelet需要的鏡像了,可以直接使用我的,也可以其他。
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/sxc-k8s-images/$imageName
done
EOFchmod +x ./images.sh && ./images.sh
首先為所有的機器添加主機域名映射如下,這里根據實際情況填寫即可。
vi /etc/hosts
172.31.26.3 cluster-master
172.31.26.4 node01
172.31.26.5 node02
虛擬機的話可以直接關閉防火墻
kubernetes集群安裝
1、master節點初始化。
#在master節點執行以下命令
kubeadm init \
--apiserver-advertise-address=172.31.26.3 \ #apiserver的地址。
--control-plane-endpoint=cluster-master \ #主節點的域名。
--image-repository registry.cn-hangzhou.aliyuncs.com/sxc-k8s-images \ #鏡像地址
--kubernetes-version v1.20.9 \ #kubernetes-version版本
--service-cidr=10.96.0.0/16 \ #k8s為service所分配的私網IP范圍
--pod-network-cidr=192.168.0.0/16 #k8s為pod所分配的私網IP范圍
保證所有網絡范圍不重疊
執行完上訴命令顯示如下表示主節點初始化成功。
#出現以下證明master節點初始化成功
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/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.conf #執行該命令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/You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8 \--control-plane Then you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8
2、work節點加入
在node01和node02節點執行以下命令,該信息是由初始化master節點成功后直接給出的。
kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8
3、安裝網絡組件calico
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
kubectl apply -f calico.yaml
該組件是用于節點之間通信的,calico鏡像可能會拉取失敗可以直接通過docker直接拉取。
網絡組件安裝好以后通過如下命令去查看pod,有如下信息
[root@cluster-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-577f77cb5c-pl9gh 1/1 Running 0 55m
kube-system calico-node-n9t97 1/1 Running 0 55m
kube-system coredns-584db6f4bf-fhg9z 1/1 Running 0 58m
kube-system coredns-584db6f4bf-fmhkx 1/1 Running 0 58m
kube-system etcd-cluster-master 1/1 Running 1 58m
kube-system kube-apiserver-cluster-master 1/1 Running 1 58m
kube-system kube-controller-manager-cluster-master 1/1 Running 4 58m
kube-system kube-proxy-l89mb 1/1 Running 0 9m40s
kube-system kube-proxy-pm96g 1/1 Running 1 58m
kube-system kube-proxy-z2lh6 1/1 Running 0 10m
kube-system kube-scheduler-cluster-master 1/1 Running 3 58m
4、查看節點是否就緒
使用以下命令查看,status為Ready表示節點的已經就緒了,若是是有節點掛了,status狀態是NotReady。
[root@cluster-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-master Ready control-plane,master 67m v1.20.9
node01 Ready <none> 18m v1.20.9
node02 Ready <none>
5、部署一個DashBoard
使用yaml配置的方式去快速部署一個bashboard。
curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O
kubectl apply -f recommended.yaml
修改訪問端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
#將type: ClusterIP 改為 type: NodePort
查看dashboard運行在哪個端口
kubectl get svc -A |grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.44.83 <none> 8000/TCP 7m3s
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.250.52 <none> 443:30592/TCP 7m4s
云服務器的記得在安全組開放這個端口,通過集群中任意集群的IP加端口都可以訪問。這個端口是隨機分配的,根據實際情況為準。
另外該地址需要通過https方式訪問。
創建訪問賬號,任然是通過yaml的方式去創建
[root@cluster-master ~]# vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
創建令牌訪問
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
會的到一個token如下,就可以在dashboard中通過token登錄了。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjVibVBCMTByTjZxcFdkZFlhTFgzV3FtbDdER0xmd1pTelZUN1YwT1pEdUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTl3NndjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxNmYxMDQ3MS00YWVhLTQxMWYtOTM5Yi1mY2JmMGJhNjg4MWIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.aqNjyfbQkTwYKQmT9Uga0rPUfHOH8qDFZyXhGLnmWkTGgfAgESZwJLzXpWcMtEtAQapYY_vehRmHg_cZ0LDTbiHqqsb45gOtjxjuHXSFPV2lDd9Pn2Adeq8ALWOXTwOgHM6xEBjrCCfuT9hdIz1WNfWlSbbb5XugZvM9jhjI6qQ0s2MSkXYP7kb1graeGkgOzaZiM9-qVxoQf0D0wUJIa4yPW-BYlVme_O8ZXArfTss7LgmlAKz14deGbvyY_sKuRJIoZgiojLZtYBu0L1fzci36TXrOckbRlFDpcCf68_CRp0SzI7eyoczxSJ9RxixDKavaqRXMsIeMxHmD8I2TzA
界面如下,輸入token就可以登陸了。
完成上述一個用來學習的kubernetes集群就安裝好了。
kubernetes安裝總結
集群安裝常見問題
1、在安裝calico組件是k8s提示Pod出現Init:ImagePullBackOff
出現這個問題的話是鏡像拉取失敗了,可以通過一下命令查看 pod安裝失敗的原因
kubectl describe pod pod名字 -n 名稱空間
若是鏡像沒有拉取成功,可以使用docker手動拉取鏡像。一般來說是docker的鏡像倉庫配置的問題。
2、work節點加入時報錯如下
error execution phase preflight: couldn't validate the identity of the API Server: Get "https://cluster-master:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": dial tcp 172.31.26.3:6443: connect: no route to host
存在這個問題的話,虛擬機搭建的集群記得關閉防火墻,若是服務器的話需要在安全組中放行6443端口號。
systemctl disable firewalld --now
setenforce 0
還有可能是token過期了,重新獲取token
kubeadm token create --print-join-command
3、在訪問dashboard時頁面提示
您的連接不是私密連接
攻擊者可能會試圖從 172.31.26.3 竊取您的信息(例如:密碼、消息或信用卡信息)。詳細了解此警告
方法一:添加到Chrome快捷方式標志 --ignore-certificate-errors ,然后重新打開并瀏覽到您的網站。在快捷方式的目標欄目的后面添加上述
方法二:當查看“您的連接不是私密”屏幕時:輸入 thisisunsafe,當Chrome不允許通過點擊設置例外時,例如對于此HSTS案例,這將允許安全例外。(親測有效)
? 完成上面的步驟,就可以搭建一個學習測試的kubernetes集群了。其實很早就接觸了這個東西,但是一直沒去學習,這次就準備好好的去學習一下。