目錄
一、K8S簡介
Kubernetes集群組件邏輯圖
Master節(jié)點組件及功能
Slave節(jié)點組件及功能
? ? ? ? ??安裝部署
二進(jìn)制包
kubeadm工具
二、準(zhǔn)備工作
軟硬件要求
集群規(guī)劃
環(huán)境配置
修改hosts配置
配置SSH免密登錄
關(guān)閉Swap分區(qū)
禁用SELinux
關(guān)閉防火墻
修改內(nèi)核參數(shù)
配置集群時鐘同步
配置k8s的Yum源
三、安裝Docker
四、安裝K8S集群
安裝三大組件-kubeadm、kubelet、kubectl
初始化k8s集群
加入節(jié)點
安裝網(wǎng)絡(luò)插件
五、測試K8S集群
創(chuàng)建nginx pod
對外暴露訪問
訪問nginx
六、安裝Dashboard
通過kubectl命令安裝
創(chuàng)建訪問賬號
獲取token
登錄界面
一、K8S簡介
Kubernetes中文官網(wǎng):Kubernetes
GitHub:github.com/kubernetes/kubernetes
Kubernetes簡稱為K8s,是用于自動部署、擴(kuò)縮和管理容器化應(yīng)用程序的開源系統(tǒng),起源于Google 集群管理工具Borg。
Kubernetes集群組件邏輯圖
k8s集群屬于Master-Slave主從架構(gòu),Master節(jié)點負(fù)責(zé)集群管理和資源調(diào)度,用于運(yùn)行控制平面組件(Control Plane Components),Slave節(jié)點就是工作負(fù)載節(jié)點,一般稱為Node節(jié)點,也叫Worker節(jié)點,主要負(fù)責(zé)運(yùn)行Pod,一個Pod里可以同時運(yùn)行多個容器,而容器一般封裝的就是基于Dokcer打包的應(yīng)用,Pod英文叫豌豆莢,每個容器就像是一顆豌豆,簡單來說Pod就是一組容器。
Master節(jié)點組件及功能
組件名稱 | 功能用途 |
kube-apiserver | 負(fù)責(zé)處理接受請求。 |
etcd | 高可用鍵值存儲,用于k8s集群的后臺數(shù)據(jù)庫。 |
kube-scheduler | 負(fù)責(zé)選擇Worker節(jié)點運(yùn)行新創(chuàng)建的Pod,需要考慮的因素包括資源需求,軟硬件及策略約束,親和性和反親和性規(guī)范、數(shù)據(jù)位置等。 |
kube-controller-manager |
負(fù)責(zé)運(yùn)行不同類型的控制器進(jìn)程,每個控制器都是一個單獨進(jìn)程,常見的控制器有節(jié)點控制器(Node Controller)、任務(wù)控制器(Job Controller)、端點分片控制器(EndpointSlice controller)、服務(wù)賬號控制器(ServiceAccount controller)等。 |
cloud-controller-manager |
用于嵌入特定的云平臺的控制器。 |
Slave節(jié)點組件及功能
組件名稱 | 功能用途 |
kubelet |
負(fù)責(zé)管理Node節(jié)點上容器的健康運(yùn)行,通過接收一組PodSpecs來實現(xiàn),每個Node節(jié)點上都會運(yùn)行一個kubelet,不會管理不是由 Kubernetes 創(chuàng)建的容器。 |
kube-proxy |
負(fù)責(zé)Node節(jié)點上的網(wǎng)絡(luò)代理,用于維護(hù)網(wǎng)絡(luò)規(guī)則,這些規(guī)則允許從集群內(nèi)部或外部與Pod進(jìn)行網(wǎng)絡(luò)通信,每個Node節(jié)點上都會運(yùn)行一個kube-proxy,k8s的Service就是利用該組件實現(xiàn)的。 |
Container Runtime |
負(fù)責(zé)管理容器的執(zhí)行和生命周期。支持多種類型的容器運(yùn)行時環(huán)境,比如 containerd、 CRI-O及CRI自定義實現(xiàn),k8s使用容器運(yùn)行時接口(CRI)和用戶選擇的容器運(yùn)行時交互。 |
安裝部署
生產(chǎn)環(huán)境部署k8s主要有兩種方式:
二進(jìn)制包
Github下載穩(wěn)定版的二進(jìn)制包,手動部署每個組件組成k8s集群。
kubeadm工具
使用Kubeadm工具可以快速搭建一個k8s集群,主要包括初始化控制平面節(jié)點和加入Worker節(jié)點,提供的主要功能如下:
- kubeadm init:初始化一個Master節(jié)點
- kubeadm join:將Worker節(jié)點加入集群
- kubeadm upgrade:升級K8s版本
- kubeadm token:管理 kubeadm join 使用的令牌
- kubeadm reset:清空 kubeadm init 或者 kubeadm join 對主機(jī)所做的任何更改
- kubeadm version:打印 kubeadm 版本
- kubeadm alpha:預(yù)覽可用的新功能
二、準(zhǔn)備工作
軟硬件要求
- Linux操作系統(tǒng),Ubuntu 或 CentOS
- 每臺節(jié)點至少2G
- Master節(jié)點至少2C
- 集群節(jié)點網(wǎng)絡(luò)互通
集群規(guī)劃
操作系統(tǒng) | CentOS Linux release 7.9.2009 x86_64 |
Docker | v24.0.6 |
k8s | v1.20.9 |
kubeadm | v1.20 |
主機(jī) | 角色 | IP | CPU | 內(nèi)存 |
node1 | Master | 192.168.5.10 |
16C | 40G |
node2 | Node | 192.168.5.11 |
16C | 40G |
node3 | Node | 192.168.5.12 |
16C | 40G |
環(huán)境配置
修改hosts配置
配置所有節(jié)點的IP和域名映射
# vim /etc/hosts
192.168.5.10 node1
192.168.5.11 node2
192.168.5.12 node3
配置SSH免密登錄
先生成公鑰對,再把公鑰遠(yuǎn)程復(fù)制到所有節(jié)點。
[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id node1
[root@node1 ~]# ssh-copy-id node2
[root@node1 ~]# ssh-copy-id node3
[root@node1 ~]# ssh node2
Last login: Mon Oct 2 17:18:39 2023 from 192.168.5.117
關(guān)閉Swap分區(qū)
kubelet要求必須禁用交換分區(qū),所以kubeadm初始化時回檢測swap是否關(guān)閉,如果沒有關(guān)閉會報錯,如果不想關(guān)閉安裝時命令行可以指定-ignore-preflight-errors=Swap,關(guān)閉Swap分區(qū)在所有節(jié)點上執(zhí)行如下命令:
# 臨時關(guān)閉,重啟恢復(fù)
[root@node1 ~]# swapoff -a
# 永久關(guān)閉
echo vm.swappiness = 0 >> /etc/sysctl.conf
[root@node1 ~]# sysctl -p
[root@node1 ~]# cat /etc/fstab
/dev/mapper/centos-swap swap swap defaults 0 0
禁用SELinux
所有節(jié)點執(zhí)行如下命令:
[root@node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
關(guān)閉防火墻
所有節(jié)點執(zhí)行如下命令:
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# systemctl stop firewalld
修改內(nèi)核參數(shù)
[root@node1 ~]# modprobe br_netfilter
[root@node1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@node1 ~]# tee /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 重新加載配置
[root@node1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
配置集群時鐘同步
Centos7默認(rèn)使用Chrony工具而非NTP進(jìn)行時間同步,修改硬件時鐘為UTC,時區(qū)為本地時區(qū),所有節(jié)點執(zhí)行如下修改:
# 硬件時鐘設(shè)置為UTC
timedatectl set-local-rtc 0
# 設(shè)置本地時區(qū),顯示本地時間
timedatectl set-timezone Asia/Shanghai
# 手動加載RTC設(shè)置
hwclock --systohc
# 驗證
[root@node1 ~]# timedatectl
Local time: Tue 2023-10-03 11:26:44 CST
Universal time: Tue 2023-10-03 03:26:44 UTC
RTC time: Tue 2023-10-03 03:26:44
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
配置k8s的Yum源
國外yum源因為網(wǎng)絡(luò)問題下載比較慢,此處修改為國內(nèi)aliyun,用于安裝k8s各個組件。
[root@node1 ~]# cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
三、安裝Docker
k8s運(yùn)行需要容器運(yùn)行環(huán)境,每個節(jié)點都需要安裝Docker,詳細(xì)安裝教程可參考我的另一篇博客:在Centos系統(tǒng)中安裝、體驗和卸載Docker_貓吃了源碼的博客-CSDN博客
四、安裝K8S集群
安裝三大組件-kubeadm、kubelet、kubectl
- kubeadm:用來初始化k8s集群的指令。
- kubelet:在集群的每個節(jié)點上用來啟動 Pod 和容器等。
- kubectl:用來與k8s集群通信的命令行工具,查看、創(chuàng)建、更新和刪除各種資源。
# 所有節(jié)點都安裝
[root@node1 ~]# yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 所有節(jié)點設(shè)置開機(jī)啟動
[root@node1 ~]# systemctl enable kubelet
初始化k8s集群
- apiserver-advertise-address:apiserver監(jiān)聽地址
- control-plane-endpoint:控制平面的IP地址或DNS名稱
- image-repository:鏡像倉庫,此處為國內(nèi)阿里云鏡像倉庫加速下載
- service-cidr:為Service分配的IP地址段
- pod-network-cidr:為pod分配的IP地址段
# 所有節(jié)點添加
echo "192.168.5.10 cluster-endpoint" >> /etc/hosts
# 只在主節(jié)點執(zhí)行
kubeadm init \
--apiserver-advertise-address=192.168.5.10 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16
初始化需要下載多個鏡像,可能時間比較久,最終安裝的鏡像如下:
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.20.9 8dbf9a6aa186 2 years ago 99.7MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.20.9 eb07fd4ad3b4 2 years ago 116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.20.9 0d0d57e4f64c 2 years ago 122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.20.9 295014c114b3 2 years ago 47.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 3 years ago 45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 3 years ago 683kB
成功界面:
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
Alternatively, 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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
--discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
要使非root用戶運(yùn)行kubectl,請執(zhí)行以下命令,這也是上面kubeadm init輸出的一部分:?
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
?如果是root用戶,則可以執(zhí)行以下命令:
export KUBECONFIG=/etc/kubernetes/admin.conf
記住上面輸出的kubeadm join命令,下面用該命令將節(jié)點加入集群。
加入節(jié)點
所有Node節(jié)點執(zhí)行如下命令:?
kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
--discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
查看token列表,可觀察到每個token的剩余有效時間
[root@node1 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
kdy4ka.jz5otwd1l3l2of5v 7h 2023-10-03T19:46:32+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
默認(rèn)token有效期為24小時,過期之后token失效,可重新生成token:
kubeadm token create --print-join-command
修改角色:
# node節(jié)點執(zhí)行
[root@node1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker
# master節(jié)點執(zhí)行
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 16h v1.20.9
node2 Ready worker 15h v1.20.9
node3 Ready worker 15h v1.20.9
安裝網(wǎng)絡(luò)插件
Calico是一套開源的純?nèi)龑拥奶摂M化網(wǎng)絡(luò)解決方案,是目前K8s主流的網(wǎng)絡(luò)方案。它把每個節(jié)點都作為一個虛擬路由器,把Pod當(dāng)做路由器上一個終端設(shè)備為其分配一個IP地址,通過BGP協(xié)議生成路由規(guī)則,實現(xiàn)不同節(jié)點上的Pod網(wǎng)絡(luò)互通。
# 下載calico.yaml并保存到本地
[root@node1 ~]# curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
修改配置
3888行 - name: CALICO_IPV4POOL_CIDR
3889行 value: "172.20.0.0/16"
# 提交
[root@node1 ~]# kubectl apply -f calico.yaml
# 驗證是否成功
[root@node1 ~]# kubectl get pod -A | grep calico
kube-system calico-kube-controllers-577f77cb5c-s6zfl 1/1 Running 0 15h
kube-system calico-node-7gsfr 1/1 Running 0 15h
kube-system calico-node-hb2k8 1/1 Running 0 15h
kube-system calico-node-xt4bl 1/1 Running 0 15h
五、測試K8S集群
創(chuàng)建nginx pod
默認(rèn)會在默認(rèn)命名空間default中創(chuàng)建一個名稱為mynignx的deployment,同時會創(chuàng)建一個名稱以myniginx為前綴,叫mynginx-5b686ccd46-wshz6的Pod。
[root@node1 ~]# kubectl create deployment mynginx --image=nginx
deployment.apps/mynginx created
# 查看pod
[root@node1 ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/mynginx-5b686ccd46-wshz6 1/1 Running 0 39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
對外暴露訪問
基于第一步創(chuàng)建的deployment再創(chuàng)建一個名叫mynginx的Service,資源類型由--type=ClusterIP修改為--type=NodePort,會在每個Node節(jié)點上監(jiān)聽30161端口,用于接收集群外部訪問。
[root@node1 ~]# kubectl expose deployment mynginx --port=80 --type=NodePort
service/mynginx exposed
# 查看
[root@node1 ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/mynginx-5b686ccd46-wshz6 1/1 Running 0 5m24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
service/mynginx NodePort 10.105.55.49 <none> 80:30161/TCP 50s
訪問nginx
瀏覽器輸入<任意一個節(jié)點IP>:<port>,都可以訪問nginx首頁表示測試成功。
六、安裝Dashboard
?k8s官方提供了一個簡單的Dashboard,主要提供工作負(fù)載,服務(wù),配置和存儲,集群等管理功能。
Github:github.com/kubernetes/dashboard
通過kubectl命令安裝
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
對外暴露訪問端口,由--type=ClusterIP修改為--type=NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
查看service
[root@node1 ~]# kubectl get svc -A|grep dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.102.247.36 <none> 8000/TCP 16h
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.38.129 <none> 443:31128/TCP 16h
瀏覽器輸入訪問地址:https://192.168.5.10:31128/,需要token才能訪問。
創(chuàng)建訪問賬號
[root@node1 ~]# vim dashboard-token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
[root@node1 ~]# kubectl apply -f dashboard-token.yaml
serviceaccount/admin-user created
獲取token
[root@node1 ~]# kubectl get secret -n kubernetes-dashboard
NAME TYPE DATA AGE
admin-user-token-vfj8s kubernetes.io/service-account-token 3 10s
default-token-w8jgn kubernetes.io/service-account-token 3 15m
kubernetes-dashboard-certs Opaque 0 15m
kubernetes-dashboard-csrf Opaque 1 15m
kubernetes-dashboard-key-holder Opaque 2 15m
kubernetes-dashboard-token-xjt6l kubernetes.io/service-account-token 3 15m
# 查看名為admin-user-token-vfj8s的secret
[root@node1 ~]# kubectl describe secret admin-user-token-vfj8s -n kubernetes-dashboard
Name: admin-user-token-vfj8s
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 36b4e5f5-2f46-488d-960c-899cb4309d50
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkhMMXFCMGVaVHVrV0hHampTRExxdHlMcjBvTVlXRHd0Vl9hc29lSXU0TG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXZmajhzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNmI0ZTVmNS0yZjQ2LTQ4OGQtOTYwYy04OTljYjQzMDlkNTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.ZoE_jz20Jf3ImLl9BwTmk5VM7Y_VacRI3ZaTbaD8ipdsDV7CCBjE9edrVtQ-L86HOU0Qb_SA3HHqO0wtGagfAVHahHJaNLcr-MAOURWmIyLg8A2K07OT_5Qr9BJC-xxFym25sOc04Cyj-Z86-LsECSbIKLhUwsxXSzAQKuPmD471MMO-_JL-FWAJ-3jdZ8E4uAMD-mhJrKyORqMgoRxPJXPgwkzd2PRPrHoiaunbxiGo6qWhONGiMITjfCW77or32TbPIDuxy94j64tWvJyVDbmyGq1J0WeOzjfobdnbyM6BRGdjP86F_P-DyTXWSfOJHbAVYcgpDcqYO_DImtg8_g
登錄界面
輸入上面的token,進(jìn)入dashboard首頁文章來源:http://www.zghlxwxcb.cn/news/detail-755241.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-755241.html
到了這里,關(guān)于K8S簡介和安裝部署詳細(xì)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!