文章很長,而且持續(xù)更新,建議收藏起來,慢慢讀!瘋狂創(chuàng)客圈總目錄 博客園版 為您奉上珍貴的學(xué)習(xí)資源 :
免費(fèi)贈送 :《尼恩Java面試寶典》 持續(xù)更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費(fèi)贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷1)加強(qiáng)版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費(fèi)領(lǐng)
免費(fèi)贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷2)加強(qiáng)版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費(fèi)領(lǐng)
免費(fèi)贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷3)加強(qiáng)版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費(fèi)領(lǐng)
免費(fèi)贈送 經(jīng)典圖書:《尼恩Java面試寶典 V11》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費(fèi)領(lǐng)
免費(fèi)贈送 資源寶庫: Java 必備 百度網(wǎng)盤資源大合集 價值>10000元 加尼恩領(lǐng)取
學(xué)習(xí) 云原生+ 微服務(wù)的神器
本地、輕量級 K8S 環(huán)境,一鍵啟動, 學(xué)習(xí) 云原生+ 微服務(wù) , 非常方便
尼恩會給大家準(zhǔn)備好 虛擬機(jī)的box文件,可以直接用,省去 折騰的煩惱
最小化K8s環(huán)境部署之Minikube
minikube 背景
徒手搭建過k8s的同學(xué)都曉得其中的煎熬,復(fù)雜的認(rèn)證,配置環(huán)節(jié)相當(dāng)折磨人,出錯率相當(dāng)高,
而minikube就是為解決這個問題而衍生出來的工具,它基于go語言開發(fā),
minikube可以在單機(jī)環(huán)境下快速搭建可用的k8s集群,非常適合測試和本地開發(fā),現(xiàn)有的大部分在線k8s實(shí)驗環(huán)境也是基于minikube
可以在minikube上體驗kubernetes的相關(guān)功能。
minikube基于go語言開發(fā), 是一個易于在本地運(yùn)行 Kubernetes 的工具,可在你的筆記本電腦上的虛擬機(jī)內(nèi)輕松創(chuàng)建單機(jī)版 Kubernetes 集群。
便于嘗試 Kubernetes 或使用 Kubernetes 日常開發(fā)。
可以在單機(jī)環(huán)境下快速搭建可用的k8s集群,非常適合測試和本地開發(fā)。
所以,可以在本地實(shí)驗環(huán)境來安裝minikube,來入門學(xué)習(xí)kubernetes相關(guān)的知識;
什么是minikube
minikube 是本地 Kubernetes,
優(yōu)點(diǎn)是:快速啟動,消耗機(jī)器資源較少,非常適合新手體驗與開發(fā)。
1、Kubernetes集群架構(gòu)
通常情況下,一套完整的Kubernetes集群至少需要包括master節(jié)點(diǎn)和node節(jié)點(diǎn),
下圖是常規(guī)k8s的集群架構(gòu),master節(jié)點(diǎn)一般是獨(dú)立的,用于協(xié)調(diào)調(diào)試其它節(jié)點(diǎn)之用,而容器實(shí)際運(yùn)行都是在node節(jié)點(diǎn)上,kubectl位于 master節(jié)點(diǎn)。
2、Minikube架構(gòu)
下圖是 Minikube的架構(gòu),可以看出,master 節(jié)點(diǎn)與其它節(jié)點(diǎn)合為一體,而整體則通過宿主機(jī)上的 kubectl 進(jìn)行管理,這樣可以更加節(jié)省資源。
其支持大部分kubernetes的功能,列表如下
- DNS
- NodePorts
- ConfigMaps and Secrets
- Dashboards
- Container Runtime: Docker, and rkt
- Enabling CNI (Container Network Interface)
- Ingress
- …
Minikube 支持 Windows、macOS、Linux 三種 OS,會根據(jù)平臺不同,下載對應(yīng)的虛擬機(jī)鏡像,并在鏡像內(nèi)安裝 k8s。
minikube安裝前準(zhǔn)備
推薦在linux主機(jī)上安裝,我本地用的是 centos。
安裝minikube的主機(jī)必要配置:
- 2 CPUs or more
- 2GB of free memory
- 20GB of free disk space
- Internet connection
- Container or virtual machine manager, such as: Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware
Container 容器我本地安裝是docker;
docker的安裝
安裝過程,請參見下面的文檔:
Docker 入門到精通 (圖解+秒懂+史上最全) - 瘋狂創(chuàng)客圈 - 博客園 (cnblogs.com)
注:由于國內(nèi)訪問docker鏡像庫很是緩慢,所以建議配置阿里云的代理,通過修改daemon配置文件/etc/docker/daemon.json來使用加速器:
$ cd /etc/docker
# 在daemon.json文件末尾追加如下配置:
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://bjtzu1jb.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://reg-mirror.qiniu.com",
"https://dockerhub.azk8s.cn",
"https://registry.docker-cn.com"
]
}
EOF
# 重啟docker
sudo systemctl daemon-reload
sudo systemctl restart docker
版本要求
For improved Docker performance, Upgrade Docker to a newer version (Minimum recommended version is 18.09.0)
! docker is currently using the devicemapper storage driver, consider switching to overlay2 for better performance
* Using image repository registry.cn-hangzhou.aliyuncs.com/google_containers
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Creating docker container (CPUs=2, Memory=2200MB) ...
* Preparing Kubernetes v1.23.1 on Docker 20.10.8 ...
docker 版本:
[root@cdh1 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.23
API version: 1.41
Go version: go1.18.10
Git commit: 7155243
Built: Thu Jan 19 17:36:21 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.23
API version: 1.41 (minimum version 1.12)
Go version: go1.18.10
Git commit: 6051f14
Built: Thu Jan 19 17:34:26 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.15
GitCommit: 5b842e528e99d4d4c1686467debf2bd4b88ecd86
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
關(guān)閉虛擬機(jī)swap、selinux、firewalld
# 臨時關(guān)閉swap
swapoff -a
# 臨時關(guān)閉selinux,如永久關(guān)閉請配置為permissive
setenforce 0
# 關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
永久關(guān)閉swap可注釋掉/etc/fstab中的swap行,然后重啟。
永久關(guān)閉selinux可編輯/etc/sysconfig/selinux,配置為SELINUX=permissive,然后重啟。
此處為常規(guī)操作不詳述。
編輯虛擬機(jī)hosts文件
與安裝k8s類似,需要添加主機(jī)名解析
echo "127.0.0.1 test1" >> /etc/hosts
其中test1為虛擬機(jī)主機(jī)名。
如果不添加該解析,啟動minikube時會有如下報錯:
[WARNING Hostname]: hostname "test1" could not be reached[WARNING Hostname]: hostname "test1": lookup test1 on 172.18.3.4:53: no such host
登錄阿里云
注冊阿里云賬號, 開通容器鏡像服務(wù)
docker login --username=修改成你自己的賬號 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kaigejava/my_kaigejava:[鏡像版本號]
docker push registry.cn-hangzhou.aliyuncs.com/kaigejava/my_kaigejava:[鏡像版本號]
創(chuàng)建用戶,加入docker用戶組
新建一個minikube用戶
useradd minikube
新建一個用戶組
groupadd docker
將minikube添加到docker組
usermod -aG docker minikube
將當(dāng)前用戶添加到該docker組(root)
usermod -aG docker $USER
更新用戶組
newgrp docker
重啟docker
sudo systemctl daemon-reload
sudo systemctl restart docker
讓用戶minikube獲得root權(quán)限
1、添加用戶,首先用adduser命令添加一個普通用戶,命令如下:
添加一個名為minikube的用戶
-
adduser minikube 添加用戶
-
passwd minikube//修改密碼
2、賦予root權(quán)限 (三種方法,推薦第三)
方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注釋(#)去掉
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
然后修改用戶,使其屬于root組(wheel),命令如下:
#usermod -g root minikube
修改完畢,現(xiàn)在可以用minikube帳號登錄,然后用命令 su – ,即可獲得root權(quán)限進(jìn)行操作。
方法二: 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
minikube ALL=(ALL) ALL
修改完畢,現(xiàn)在可以用minikube帳號登錄,然后用命令 su – ,即可獲得root權(quán)限進(jìn)行操作。
su minikube
su -
方法三: 修改 /etc/passwd 文件,直接修改用戶id為0,就是root的用戶id
cat /etc/passwd
7 個字段的詳細(xì)信息如下:
(1)用戶名 (user1): 已創(chuàng)建用戶的用戶名,字符長度 1 個到 12 個字符。如果是“*”的話,那么就表示該賬號被查封了,系統(tǒng)不允許持有該賬號的用戶登錄。
(2)密碼(x):代表加密密碼,保存在 /etc/shadow 文件中。
(3)用戶 ID(1001):代表用戶的 ID 號,每個用戶都要有一個唯一的 ID 。UID 號為 0 的是為 root 用戶保留的,UID 號 1 到99 是為系統(tǒng)用戶保留的,UID 號 100-999 是為系統(tǒng)賬戶和群組保留的。
(4)群組 ID (100):代表user1用戶所屬群組的 ID 號,每個群組都要有一個唯一的 GID ,群組信息保存在 /etc/group文件中。
(5)用戶信息(用戶1):代表描述字段,可以用來描述用戶的信息。
(6)家目錄(/usr/testUser):代表用戶的主目錄。
(7)Shell(/bin/bash):代表用戶使用的 shell 類型。
找到如下行,把用戶ID修改為 0 ,如下所示:
minikube:x:1001:1001::/hminikubekube:/bin/bash
修改后如下
minikube:x:0:1001::/home/minikube:/bin/bash
保存,用minikube賬戶登錄后,直接獲取的就是root帳號的權(quán)限。
安裝minikube
minikube的官網(wǎng):minikube start | minikube (k8s.io)
安裝與啟動minikube
官網(wǎng)上的安裝minikube網(wǎng)速實(shí)在太慢了,推薦使用阿里云的鏡像來進(jìn)行安裝minikube,
直接安裝minikube
#阿里云鏡像
curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.23.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
#官方二進(jìn)制包下載
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
65M
linux 下載太慢,我用瀏覽器下載后, 放在虛擬機(jī)共享目錄
然后 復(fù)制到 /usr/local/bin
[root@cdh1 ~]# su kube
[root@cdh1 root]# cp /vagrant/minikube-linux-amd64 /usr/local/bin/
[root@cdh1 root]# cp /vagrant/minikube-linux-amd64 /usr/local/bin
[root@cdh1 root]# chmod +x /usr/local/bin/minikube-linux-amd64
[root@cdh1 root]# mv /usr/local/bin/minikube-linux-amd64 /usr/local/bin/minikube
啟動minikube
minikube start
執(zhí)行minikube start
出現(xiàn) The “docker” driver should not be used with root privileges 的報錯.
如果是本地測試環(huán)境,根本就不需要考慮那么多,直接執(zhí)行以下命令,強(qiáng)制使用docker:
minikube start --force --driver=docker
# 或者使用阿里云鏡像啟動
minikube start --force --driver=docker --image-mirror-country cn --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso --registry-mirror=https://xxxxxx.mirror.aliyuncs.com
minikube start --force --driver=docker --image-mirror-country='cn' --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso --registry-mirror=https://xxxxxx.mirror.aliyuncs.com
還是有問題, docker image 下載不了
血和淚,用過的 命令list
minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --registry-mirror=https://ovfftd6p.mirror.aliyuncs.com --image-mirror-country='cn' --force --driver=docker
sudo minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=none
su minikube
minikube delete
minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --force --driver=docker
minikube start 參數(shù)
啟動命令:minikube start "參數(shù)"
- –image-mirror-country cn 將缺省利用 registry.cn-hangzhou.aliyuncs.com/google_containers 作為安裝Kubernetes的容器鏡像倉庫,
- –iso-url=*** 利用阿里云的鏡像地址下載相應(yīng)的 .iso 文件
- –cpus=2: 為minikube虛擬機(jī)分配CPU核數(shù)
- –memory=2000mb: 為minikube虛擬機(jī)分配內(nèi)存數(shù)
- –kubernetes-version=***: minikube 虛擬機(jī)將使用的 kubernetes 版本 ,e.g. --kubernetes-version v 1.17.3
- –docker-env http_proxy 傳遞代理地址
默認(rèn)啟動使用的是 VirtualBox 驅(qū)動,使用 --vm-driver 參數(shù)可以指定其它驅(qū)動
# https://minikube.sigs.k8s.io/docs/drivers/
- --vm-driver=none 表示用容器;
- --vm-driver=virtualbox 表示用虛擬機(jī);
注意: To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:
sudo mv /root/.kube /root/.minikube $HOME
sudo chown -R $USER $HOME/.kube $HOME/.minikube
示例#
–vm-driver=kvm2
參考: https://minikube.sigs.k8s.io/docs/drivers/kvm2/
minikube start --image-mirror-country cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --registry-mirror=https://ovfftd6p.mirror.aliyuncs.com --driver=kvm2
–vm-driver=hyperv
# 創(chuàng)建基于Hyper-V的Kubernetes測試環(huán)境
minikube.exe start --image-mirror-country cn \
--iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso \
--registry-mirror=https://xxxxxx.mirror.aliyuncs.com \
--vm-driver="hyperv" \
--hyperv-virtual-switch="MinikubeSwitch" \
--memory=4096
–vm-driver=none
sudo minikube start --image-mirror-country cn --vm-driver=none
sudo minikube start --vm-driver=none --docker-env http_proxy=http://$host_IP:8118 --docker-env https_proxy=https:// $host_IP:8118
其中$host_IP指的是host的IP,可以通過ifconfig查看;比如在我這臺機(jī)器是10.0.2.15,用virtualbox部署,則用下列命令啟動minikube
sudo minikube start --vm-driver=none --docker-env http_proxy=http://10.0.2.15:8118 --docker-env https_proxy=https://10.0.2.15:8118
sudo minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'
sudo minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --extra-config=kubelet.cgroup
拉取鏡像的問題
錯誤日志查看
minikube logs
Q1:解決minikube拉取鏡像速度緩慢的問題
需要進(jìn)入minikube進(jìn)程內(nèi)部,修改遠(yuǎn)程鏡像倉庫
minikube ssh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
解決 minikube start
過程中拉取鏡像慢的問題
之前下載失敗后的minikube,想要重新下載記得先刪除
minikube delete --all
拉取鏡像慢可以拉取國內(nèi)倉庫,minikube start的時候會幫我們下載新版的kubernetes,但是我這里不太支持最新版的,所以需要指定kubernetes版本
minikube start --kubernetes-version=v1.23.1 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://ovfftd6p.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker --extra-config=kubelet.cgroup-driver=systemd
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.aliyuncs.com/google_containers' --registry-mirror=https://kfwkfulq.mirror.aliyuncs.com --image-mirror-country='cn' --force --driver=docker --extra-config=kubelet.cgroup-driver=systemd
--registry-mirror=https://bjtzu1jb.mirror.aliyuncs.com
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://bjtzu1jb.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker --extra-config=kubelet.cgroup-driver=systemd
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://bjtzu1jb.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker --extra-config=kubelet.cgroup-driver=systemd --base-image="registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27"
Q2:基礎(chǔ)鏡像拉不下來
錯誤日志查看
minikube logs
基礎(chǔ)鏡像拉不下來
registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27
鏡像地址調(diào)整為 registry.aliyuncs.com
registry.aliyuncs.com/google_containers/kicbase:v0.0.27
單獨(dú)下載
docker pull registry.aliyuncs.com/google_containers/kicbase:v0.0.27
打tag
docker tag registry.aliyuncs.com/google_containers/kicbase:v0.0.27 registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27
刪除老的tag
[root@cdh1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kicbase v0.0.27 9fa1cc16ad6d 16 months ago 1.08GB
registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase v0.0.27 9fa1cc16ad6d 16 months ago 1.08GB
[root@cdh1 ~]# docker rmi registry.aliyuncs.com/google_containers/kicbase:v0.0.27
Untagged: registry.aliyuncs.com/google_containers/kicbase:v0.0.27
Untagged: registry.aliyuncs.com/google_containers/kicbase@sha256:89b4738ee74ba28684676e176752277f0db46f57d27f0e08c3feec89311e22de
2.指定鏡像啟動
因為 registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27 自動下載、sha校驗失敗,而無法啟動集群!
手動下載后,打tag后
還有驗證環(huán)節(jié),需要指定鏡像,忽略SHA校驗
參數(shù) | 值 |
---|---|
–base-image | 指定鏡像,忽略SHA校驗 |
使用以下命令啟動minikube:
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://bjtzu1jb.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker --extra-config=kubelet.cgroup-driver=systemd --base-image="registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27"
minikube start --kubernetes-version=v1.23.1 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --registry-mirror='https://bjtzu1jb.mirror.aliyuncs.com' --image-mirror-country='cn' --force --driver=docker --base-image="registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.27"
終于開始創(chuàng)建容器,開始啟動了
Q3: 新的問題來了:coredns 鏡像找不到
X Unable to load cached images: loading cached images: Docker load /var/lib/minikube/images/coredns_v1.8.4: loadimage docker.: /bin/bash -c "sudo cat /var/lib/minikube/images/coredns_v1.8.4 | docker load": Process exited with status 1
直接下載
docker pull coredns/coredns:1.8.4
改tag
docker tag coredns/coredns:1.8.4 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.4
刪除舊tag
docker rmi coredns/coredns:1.8.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.4 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4
再次啟動
Q4:繼續(xù)下載鏡像
#從國內(nèi)鏡像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull coredns/coredns:1.8.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetesui/dashboard:v2.3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetesui/metrics-scraper:v1.0.7
docker pull k8s-minikube/storage-provisioner:v5
docker pull kubernetesui/dashboard:v2.3.1
docker pull kubernetesui/metrics-scraper:v1.0.7
docker pull registry.aliyuncs.com/k8s-minikube/storage-provisioner:v5
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull etcd/etcd:3.5.1-0
改tag
docker tag coredns/coredns:1.8.4 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.4
Q5:使用阿里云代理http://k8s.gcr.io鏡像倉庫
國內(nèi)根本訪問不了k8s的鏡像庫:k8s.gsc.io
。
? 比如下載k8s.gcr.io/coredns
:1.6.5鏡像,在國內(nèi)默認(rèn)是下載失敗的!
[root@k8s-vm03 ~]# docker pull k8s.gcr.io/coredns:1.6.5
Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
部署K8S最大的難題是鏡像下載,在國內(nèi)無翻墻環(huán)境情況下很難從k8s.gcr.io等鏡像源里下載鏡像。
這種情況下正確做法是:
- 直接指定國內(nèi)鏡像代理倉庫(如阿里云代理倉庫)進(jìn)行鏡像拉取下載。
- 成功拉取代理倉庫中的鏡像后,再將其tag打標(biāo)簽成為k8s.gcr.io對應(yīng)鏡像。
- 最后再刪除從代理倉庫中拉取下來的鏡像。
- 要確保imagePullPolicy策略是IfNotPresent,即本地有鏡像則使用本地鏡像,不拉取!
或者將下載的鏡像放到harbor私有倉庫里,然后將image下載源指向harbor私倉地址。
# 阿里云代理倉庫地址為:registry.aliyuncs.com/google_containers
# 比如下載
k8s.gcr.io/coredns:1.6.5
# 可以代理為:
registry.aliyuncs.com/google_containers/coredns:1.6.5
下面以阿里云代理倉庫為例進(jìn)行說明:
# 比如下載k8s.gcr.io/coredns:1.6.5鏡像,在國內(nèi)默認(rèn)是下載失敗的!
[root@k8s-vm01 coredns]# pwd
/opt/k8s/work/kubernetes/cluster/addons/dns/coredns
[root@k8s-vm01 coredns]# fgrep "image" ./*
./coredns.yaml: image: k8s.gcr.io/coredns:1.6.5
./coredns.yaml: imagePullPolicy: IfNotPresent
[root@k8s-vm03 ~]# docker pull k8s.gcr.io/coredns:1.6.5
Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
# 這時候去指定國內(nèi)的阿里云鏡像代理倉庫進(jìn)行下載
[root@k8s-vm03 ~]# docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
1.6.5: Pulling from google_containers/coredns
c6568d217a00: Pull complete
fc6a9081f665: Pull complete
Digest: sha256:608ac7ccba5ce41c6941fca13bc67059c1eef927fd968b554b790e21cc92543c
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/coredns:1.6.5
registry.aliyuncs.com/google_containers/coredns:1.6.5
# 然后打tag,并刪除之前從代理倉庫下載的鏡像
[root@k8s-vm03 ~]# docker tag registry.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
[root@k8s-vm03 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/coredns 1.6.5 70f311871ae1 5 months ago 41.6MB
registry.aliyuncs.com/google_containers/coredns 1.6.5 70f311871ae1 5 months ago 41.6MB
[root@k8s-vm03 ~]# docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns@sha256:608ac7ccba5ce41c6941fca13bc67059c1eef927fd968b554b790e21cc92543c
[root@k8s-vm03 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/coredns 1.6.5 70f311871ae1 5 months ago 41.6MB
# 最終發(fā)現(xiàn)我們想要的k8s.gcr.io/coredns:1.6.5鏡像被成功下載下來了!
# 最后要記得:
# 確定imagePullPolicy鏡像下載策略是IfNotPresent,即本地有鏡像則使用本地鏡像,不拉??!
# 或者將下載好的鏡像放到harbor私有倉庫里,然后將image下載地址指向harbor倉庫地址。
以上總結(jié)三個步驟:
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.5
Virtual Box 使用的問題
Q1:嵌套虛擬化問題
什么是嵌套 虛擬化特性?
我們知道,在Intel處理器上,Vitural box使用Intel的vmx(virtul machine eXtensions)來提高虛擬機(jī)性能, 即硬件輔助虛擬化技術(shù),
現(xiàn)在如果我們需要需要多臺具備"vmx"支持的主機(jī), 但是又沒有太多物理服務(wù)器可使用,
如果我們的虛擬機(jī)能夠和物理機(jī)一樣支持"vmx",那么問題就解決了,
而正常情況下,一臺虛擬機(jī)無法使自己成為一個hypervisors并在其上再次安裝虛擬機(jī),因為這些虛擬機(jī)并不支持"vmx", 此時,可以使用 嵌套式虛擬nested
嵌套式虛擬nested是一個可通過內(nèi)核參數(shù)來啟用的功能。
它能夠使一臺虛擬機(jī)具有物理機(jī)CPU特性,支持vmx或者svm(AMD)硬件虛擬化,
虛擬機(jī)啟用嵌套VT-x/AMD-V
嵌套 虛擬化特性在VirtualBox虛擬機(jī)中默認(rèn)是不啟用的(設(shè)置-系統(tǒng)-處理器):
打開Windows Powershell,進(jìn)入VirtualBox安裝目錄,將要安裝minikube的虛擬機(jī)啟用嵌套VT-x/AMD-V。
# 進(jìn)入安裝目錄
cd 'C:\Program Files\Oracle\VirtualBox\'
# 列出所有虛擬機(jī)
C:\Program Files\Oracle\VirtualBox>.\VBoxManage.exe list vms
"cdh1" {309cd81a-248c-4184-9f99-8fe72d01c1f0}
# 打開嵌套虛擬化功能
.\VBoxManage.exe modifyvm "cdh1" --nested-hw-virt on
啟用完成后可以看到界面中該選項已勾選:
Q2:conntrack依賴
安裝conntrack(后面使用–driver=none啟動,依賴此包)
yum install conntrack -y
使用如下命令啟動minikube
minikube start --registry-mirror="https://na8xypxe.mirror.aliyuncs.com" --driver=none
使用–driver=none的好處是可以直接使用root運(yùn)行minikube,無需再配置其他用戶。
缺點(diǎn)是安全性降低、穩(wěn)定性降低、數(shù)據(jù)丟失風(fēng)險、無法使用–cpus、–memory進(jìn)行資源限制等等,
但這不是我們需要考慮的,因為本身安裝minikube就是測試學(xué)習(xí)用的。
關(guān)于driver的選擇,詳細(xì)可以參看:none | minikube (k8s.io)
啟動時我們看到如下報錯:
stderr:
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
根據(jù)提示進(jìn)行解決即可:
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
再次嘗試啟動,啟動成功:
[root@test1 ~]# minikube start --registry-mirror="https://na8xypxe.mirror.aliyuncs.com" --driver=none
* minikube v1.18.1 on Centos 7.6.1810
* Using the none driver based on existing profile
* Starting control plane node minikube in cluster minikube
* Restarting existing none bare metal machine for "minikube" ...
* OS release is CentOS Linux 7 (Core)
* Preparing Kubernetes v1.20.2 on Docker 1.13.1 ...
- Generating certificates and keys ...
- Booting up control plane ...
- Configuring RBAC rules ...
* Configuring local host environment ...
*
! The 'none' driver is designed for experts who need to integrate with an existing VM
* Most users should use the newer 'docker' driver instead, which does not require root!
* For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/
*
! kubectl and minikube configuration will be stored in /root
! To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:
*
- sudo mv /root/.kube /root/.minikube $HOME
- sudo chown -R $USER $HOME/.kube $HOME/.minikube
*
* This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
* Verifying Kubernetes components...
- Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v4 (global image repository)
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Q3:依賴kubectl、kubelet
添加阿里云kubenetes yum源
# /etc/yum.repos.d/kubenetes.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
生成元數(shù)據(jù)緩存
# 生成元數(shù)據(jù)緩存
yum makecache
安裝kubectl、kubelet
yum install kubectl -y
yum install kubelet -y
systemctl enable kubelet
帶著版本安裝
yum list available kubectl
kubectl version
yum remove kubectl
yum install -y kubelet-1.23.1 kubectl-1.23.1 kubeadm-1.23.1
查看版本
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.1", GitCommit:"86ec240af8cbd1b60bcc4c03c20da9b98005b92e", GitTreeState:"clean", BuildDate:"2021-12-16T11:41:01Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Q4: 橋接問題
啟動時我們看到如下報錯:
stderr:error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
根據(jù)提示進(jìn)行解決即可:
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
Q5:初始化失敗報錯,升級內(nèi)核
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR SystemVerification]: unexpected kernel config: CONFIG_CGROUP_PIDS
[ERROR SystemVerification]: missing required cgroups: pids
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=...
To see the stack trace of this error execute with --v=5 or higher
首先,你要在cat /boot/config-uname -r
| grep CGROUP這個文件里面加CONFIG_CGROUP_PIDS=y,
然后你再升級一下內(nèi)核就可以了。
內(nèi)核升級參考
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-ml
cp /etc/default/grub /etc/default/grub_bak
vi /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
systemctl enable docker.service
re
查看內(nèi)核版本
[root@cdh1 ~]# awk -F\' ' $1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.1.8-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-327.4.5.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-e147b422673549a3b4fda77127bd4bcd) 7 (Core)
編輯 /etc/default/grub 文件
設(shè)置 GRUB_DEFAULT=0,通過上面查詢顯示的編號為 0 的內(nèi)核作為默認(rèn)內(nèi)核:
(sed ‘s, release .*$,g’ /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“crashkernel=auto rd.lvm.lv=cl/root rhgb quiet”
GRUB_DISABLE_RECOVERY=“true”
生成 grub 配置文件并重啟
$ grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file …
Found linux image: /boot/vmlinuz-5.12.1-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.12.1-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.25.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.25.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-16ba4d58b7b74338bfd60f5ddb0c8483
Found initrd image: /boot/initramfs-0-rescue-16ba4d58b7b74338bfd60f5ddb0c8483.img
done
$ reboot
查看內(nèi)核版本
$ uname -sr
Linux 6.1.8-1.el7.elrepo.x86_64
Q6:vboxsf 共享文件系統(tǒng)丟失
升級centos內(nèi)核后出現(xiàn)以下異常:
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem “vboxsf” is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:
mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant
The error output from the command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device
解決方法一:
vagrant plugin install vagrant-vbguest
vagrant reload --provision
好像不行
解決方法2:
將kernel-devel也升級到
# yum --enablerepo=elrepo-kernel install kernel-lt-devel
yum install kernel
yum install kernel-headers
yum install kernel-devel
yum install gcc*
yum install make
安裝完成之后,執(zhí)行
/etc/init.d/vboxadd setup
成功!
掛載共享目錄
mount -t vboxsf -o uid=0,gid=0,_netdev vagrant /vagrant
按照對應(yīng)的kernel-devel
LINUX中的kernel-devel工具是干什么的?
如果某個程序需要內(nèi)核提供的一些功能,它就需要內(nèi)核的 C header 來編譯程序,這個時候 linux-devel 里面的東西就用上了。
kernel-devel 不光是 C Header 文件,它還有內(nèi)核的配置文件,以及其他的開發(fā)用的資料。
區(qū)別:kernel-devel包只包含用于內(nèi)核開發(fā)環(huán)境所需的內(nèi)核頭文件以及Makefile,而kernel-souce包含所有內(nèi)核源代碼。
如果僅僅是用于你自己編寫的模塊開發(fā)的話,因為只需引用相應(yīng)的內(nèi)核頭文件,所以只有devel包即可,如果你要修改現(xiàn)有的內(nèi)核源代碼并重新編譯,那必須是kernel-souce。
kernel-souce在RH某些版本之后不再附帶在發(fā)行版中了,必須自己通過kernel-XXX.src.rpm做出來。
kernel-devel是用做內(nèi)核一般開發(fā)的,比如編寫內(nèi)核模塊,原則上,可以不需要內(nèi)核的原代碼。
kernel則是專指內(nèi)核本身的開發(fā),因此需要內(nèi)核的原代碼。
rpm 去
https://pkgs.org/download/kernel(list_del) 找 kernel-xxx.rpm
https://pkgs.org/download/kernel-devel 找 kernel-devel-xxxx.rpm
[root@cdh1 ~]# rpm -qa | grep kernel
kernel-devel-3.10.0-327.el7.x86_64
kernel-ml-6.1.8-1.el7.elrepo.x86_64
kernel-3.10.0-1160.83.1.el7.x86_64
kernel-tools-3.10.0-327.4.5.el7.x86_64
kernel-lt-devel-5.4.230-1.el7.elrepo.x86_64
kernel-tools-libs-3.10.0-327.4.5.el7.x86_64
kernel-3.10.0-327.4.5.el7.x86_64
kernel-devel-3.10.0-327.4.5.el7.x86_64
kernel-headers-3.10.0-1160.83.1.el7.x86_64
kernel-3.10.0-327.el7.x86_64
kernel-devel-3.10.0-1160.83.1.el7.x86_64
[root@cdh1 ~]# uname -sr
Linux 6.1.8-1.el7.elrepo.x86_64
[root@cdh1 ~]# awk -F\' ' $1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.1.8-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-327.4.5.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-e147b422673549a3b4fda77127bd4bcd) 7 (Core)
[root@cdh1 ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
https://pkgs.org/download/kernel-devel 找 kernel-devel-xxxx.rpm
kernel-devel-6.1.8-1.el7.elrepo.x86_64.rpm
1.下載rpm ,網(wǎng)址
https://pkgs.org/download/kernel-devel
查看Install Howto 部分,進(jìn)入對應(yīng)網(wǎng)址,如
http://mirror.rackspace.com/elrepo/elrepo/el6/i386/RPMS/
下載對應(yīng)elrepo-release*rpm
kernel-ml-devel-6.1.8-1.el7.elrepo.x86_64.rpm CentOS 7, RHEL 7, Rocky Linux 7, AlmaLinux 7 Download (pkgs.org)
POD 容器的問題
K8s的常用命令
kubectl get pods -A 查看所有的命令空間下的pods
kubectl describe node 查看所有節(jié)點(diǎn)的cpu和內(nèi)存使用情況
kubectl describe node nodename |grep Taints 查看該節(jié)點(diǎn)是否可達(dá),是否可以部署內(nèi)容;一般三種情況
kubectl -n namespace名 logs -f --tail 200 pod名 -n namespace 查看命名空間下的 pods日志(運(yùn)行后才有日志,此命令查看實(shí)時的200條日志)
kubectl exec -it -n namespace名 pod名 sh 進(jìn)入pod
kubectl get services,pods -o wide 查看所有的pods和services, -o 輸出格式為wide或者yaml
kubectl describe pod pod名 -n namespace名 查看pod的描述狀態(tài)
kubectl describe job/ds/deployment pod名 -n namespace名 查看三個控制器下pod描述
kubectl exec -it pod名 -c 容器名 – /bin/bash
kubectl get pod pod名 -n namespace名 -oyaml | kubectl replace --force -f - 重啟pod命令
kubectl get pods -n namespace名
kubectl get pods pod名 -o yaml -n namespace名
kubectl get ds -n namespace名 查看命名空間下daemonset的信息
kubectl get ds ds名 -o yaml -n namespace名
kubectl get deployment -n namespace名
kubectl get deployment deployment名 -o yaml -n namespace名
后面加–force --grace-period=0;立刻強(qiáng)制刪除與下面的一起用
刪除當(dāng)前的應(yīng)用:kubectl delete ds daemonset名 -n namespace名、kubectl delete deployment deployment名 -n namespace名(備注:如果是沒刪除ds/deployment/job,直接刪除對應(yīng)的pod(kubectl delete pod pod名 -n namespace名,pod會一直重啟)
查看容器實(shí)時最新的10條日志 docker logs -f -t --tail 10 容器名
kubectl delete job jobname -n namespace名(job任務(wù)也是如此)
查看所有的pod,看看哪些有問題
kubectl get pods -A
[root@cdh1 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-grphf 1/1 Running 0 8m16s
kube-system etcd-cdh1 1/1 Running 1 8m29s
kube-system kube-apiserver-cdh1 1/1 Running 1 8m31s
kube-system kube-controller-manager-cdh1 1/1 Running 1 8m29s
kube-system kube-proxy-78trt 1/1 Running 0 8m16s
kube-system kube-scheduler-cdh1 1/1 Running 1 8m29s
kube-system storage-provisioner 0/1 ImagePullBackOff 0 8m28s
kubernetes-dashboard dashboard-metrics-scraper-5496b5d99f-llh9t 0/1 ImagePullBackOff 0 6m28s
kubernetes-dashboard kubernetes-dashboard-58b48666f8-hsn8g 0/1 ImagePullBackOff 0 6m28s
storage-provisioner 的ImagePullBackOff 狀態(tài)
kubectl get pods -A
kubectl describe pod XXX -n kube-system
通過kubectl describe命令詳細(xì)查看redis-master-0這個pod:
[root@cdh1 ~]# kubectl describe pod storage-provisioner -n kube-system
Name: storage-provisioner
Namespace: kube-system
Priority: 0
Node: cdh1/10.0.2.15
Start Time: Sun, 29 Jan 2023 05:17:14 +0800
Labels: addonmanager.kubernetes.io/mode=Reconcile
integration-test=storage-provisioner
Annotations: <none>
Status: Pending
IP: 10.0.2.15
IPs:
IP: 10.0.2.15
Containers:
storage-provisioner:
Container ID:
Image: registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5
Image ID:
Port: <none>
Host Port: <none>
Command:
/storage-provisioner
State: Waiting
Reason: ImagePullBackOff
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/tmp from tmp (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l5h2b (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
tmp:
Type: HostPath (bare host directory volume)
Path: /tmp
HostPathType: Directory
kube-api-access-l5h2b:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 27m default-scheduler 0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
Normal Scheduled 27m default-scheduler Successfully assigned kube-system/storage-provisioner to cdh1
Normal Pulling 26m (x4 over 27m) kubelet Pulling image "registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5"
Warning Failed 26m (x4 over 27m) kubelet Failed to pull image "registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5": rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Warning Failed 26m (x4 over 27m) kubelet Error: ErrImagePull
Warning Failed 25m (x6 over 27m) kubelet Error: ImagePullBackOff
Normal BackOff 2m39s (x109 over 27m) kubelet Back-off pulling image "registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5"
dashboard-metrics-scraper-5496b5d99f-wj2d9
我們查看一下storage-provisioner pod的imagePullPolicy:
# kubectl get pod dashboard-metrics-scraper-5496b5d99f-wj2d9 -n kubernetes-dashboard -o yaml
... ...
spec:
containers:
- command:
- /storage-provisioner
image: registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5
imagePullPolicy: IfNotPresent
name: storage-provisioner
我們發(fā)現(xiàn)storage-provisioner的imagePullPolicy為ifNotPresent,這意味著如果本地有storage-provisioner:v5這個鏡像的話,minikube不會再去遠(yuǎn)端下載該image。這樣我們可以先將storage-provisioner:v5下載到本地并重新tag為registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5。
啟動Dashboard
使用如下命令啟動dashboard:
$ minikube addons enable dashboard
? Using image kubernetesui/dashboard:v2.3.1
? Using image kubernetesui/metrics-scraper:v1.0.7
Some dashboard features require the metrics-server addon. To enable all features please run:
minikube addons enable metrics-server
The 'dashboard' addon is enabled
$ minikube addons enable metrics-server
? Using image k8s.gcr.io/metrics-server/metrics-server:v0.4.2
The 'metrics-server' addon is enabled
$ minikube dashboard
Verifying dashboard health ...
Launching proxy ...
Verifying proxy health ...
Opening http://127.0.0.1:39887/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
http://127.0.0.1:39887/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
直接用minikube addons啟動Dashboard,提示還需要一并啟用metrics-server,都enable下
終于啟動了
[minikube@cdh1 root]$ kubectl get pod -A
如何從宿主機(jī)也就是我們的Windows中訪問dashborad呢
從上面輸出的信息可以看到,dashboard綁定的IP地址為本地回環(huán)地址127.0.0.1,這意味著該地址只能在本地訪問。
虛擬機(jī)是沒有GUI的,那么如何從宿主機(jī)也就是我們的Windows中訪問dashborad呢?
可以進(jìn)行如下操作:
使用 nginx、openresty 進(jìn)行 反向代理
http://127.0.0.1:39887/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
http://k8s:80/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
直接使用
此時的minikube kubectl --
就相當(dāng)于k8s里的kubectl
命令,當(dāng)然我們實(shí)際不會這樣使用,
我們可以minikube的命令給alias一下:
$ alias kubectl="minikube kubectl --"
此時再直接運(yùn)行kubectl
命令:
$ kubectl
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
Basic Commands (Beginner):
create Create a resource from a file or from stdin
expose Take a replication controller, service, deployment or pod and expose it as a new
Kubernetes service
run 在集群中運(yùn)行一個指定的鏡像
set 為 objects 設(shè)置一個指定的特征
Basic Commands (Intermediate):
explain Get documentation for a resource
get 顯示一個或更多 resources
edit 在服務(wù)器上編輯一個資源
delete Delete resources by file names, stdin, resources and names, or by resources and
label selector
...
好了,就可以愉快的k8s玩耍了。
minikube重建
如果環(huán)境搞亂了想重新部署,很簡單就可以實(shí)現(xiàn)
$ minikube delete
$ minikube start --driver=docker // 這里指定了用docker,不指定也會自動檢測
docker-compose to minikube
需要將docker-compose.yaml轉(zhuǎn)變?yōu)閗8s deploy、svc、configmap,以swagger-ui為例
docker-compose.yaml
version: "3.0"
services:
swiagger-ui:
image: swaggerapi/swagger-ui
container_name: swagger_ui_container
ports:
- "9092:8080"
volumes:
- ../docs/openapi:/usr/share/nginx/html/doc
environment:
API_URL: ./doc/api.yaml
k8s deploy、svc、configmap
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
io.minikube.service: swagger-ui
name: swagger-ui
spec:
replicas: 1
selector:
matchLabels:
io.minikube.service: swagger-ui
template:
metadata:
labels:
io.minikube.service: swagger-ui
spec:
containers:
- env:
- name: SWAGGER_JSON
value: /openapi/api.yaml
image: swaggerapi/swagger-ui
name: swagger-ui
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /openapi
name: swagger-ui-cm
volumes:
- name: swagger-ui-cm
configMap:
name: swagger-ui-cm
---
apiVersion: v1
kind: Service
metadata:
name: swagger-ui
labels:
io.minikube.service: swagger-ui
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
io.minikube.service: swagger-ui
---
apiVersion: v1
kind: ConfigMap
metadata:
name: swagger-ui-cm
data:
api.yaml: |
openapi: 3.0.0
version: "1.0"
...
遇到的問題
外部訪問問題
minikube內(nèi)的k8s網(wǎng)絡(luò)明顯與host不一樣,不論使用不使用Type=NodePort,都無法直接訪問,都需要用port-forward
這里查了些資料,可能的一個解釋是,minikube使用docker-machine為底層,實(shí)現(xiàn)可以部署到vm、container、host等基礎(chǔ)設(shè)施上,docker-machine會構(gòu)建自身的docker環(huán)境,與host不同,網(wǎng)絡(luò)也不在一個平面,所以使用NodePort,從host也無法訪問,需要借助kubectl port-forward --address=0.0.0.0 service/hello-minikube 7080:8080。
------------ 2021-11-26 update---------------
可以使用以下命令獲取minikube的ip,然后通過該ip+nodeport訪問
$ minikube ip
192.168.49.2
也可以通過一下命令直接獲取對應(yīng)service的url
$ minikube service hello-minikube --url
http://192.168.49.2:30660
pull image問題
minikube內(nèi)的docker daemon與host docker daemon不一樣,且k8s不與host上的docker共享信息,host上的docker images和daemon.json配置對minikube內(nèi)的docker daemon不可見,minikube內(nèi)的docker daemon總是從dockerhub pull image,會遇到
You have reached your pull rate limit.
You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limits.
You must authenticate your pull requests.
解決辦法
可以先用host docker pull images,然后load到minikube
$ docker pull <image name>
$ minikube image load <image name>
注意k8s默認(rèn)的imagePullPolicy
Default image pull policy
When you (or a controller) submit a new Pod to the API server, your cluster sets theimagePullPolicy
field when specific conditions are met:
if you omit theimagePullPolicy
field, and the tag for the container image is:latest
,imagePullPolicy
is automatically set toAlways
;
if you omit theimagePullPolicy
field, and you don’t specify the tag for the container image,imagePullPolicy
is automatically set toAlways
;
if you omit theimagePullPolicy
field, and you specify the tag for the container image that isn’t:latest
, theimagePullPolicy
is automatically set toIfNotPresent
.
- 如果沒有設(shè)置imagePullPolicy,但image tag是latest,那么默認(rèn)就是imagePullPolicy: Always
- 如果沒有設(shè)置imagePullPolicy,也沒有設(shè)置image tag,那么默認(rèn)也是imagePullPolicy: Always
- 如果設(shè)置了image tag,默認(rèn)imagePullPolicy: IfNotPresent
為了不出錯,建議直接指定imagePullPolicy: IfNotPresent
參考資料
Minikube - Kubernetes本地實(shí)驗環(huán)境-阿里云開發(fā)者社區(qū) (aliyun.com)
minikube start | minikube (k8s.io)
安裝Istio - 肖祥 - 博客園 (cnblogs.com)
https://cn.dubbo.apache.org/zh/overview/tasks/traffic-management/
Kubernetes入門,使用minikube 搭建本地k8s 環(huán)境 (bbsmax.com)
CentOS7下minikube的安裝 - 拾月凄辰 - 博客園 (cnblogs.com)
按照Kubernetes官網(wǎng)教程Installing kubeadm遇到的幾個大坑_阿里云__小魚塘-DevPress官方社區(qū) (csdn.net)
(14條消息) 如何在VirtualBox的CentOS虛擬機(jī)中安裝阿里云版本Minikube_灑滿陽光的午后的博客-CSDN博客_宿主機(jī)怎么訪問虛機(jī)中的minikube
7.我在B站學(xué)云原生之Kubernetes入門實(shí)踐基于containerd容器運(yùn)行時安裝部署K8S集群環(huán)境 - 嗶哩嗶哩 (bilibili.com)
(26條消息) centos升級系統(tǒng)內(nèi)核_centos 升級內(nèi)核_月夜楓的博客-CSDN博客
https://blog.csdn.net/m0_62948770/article/details/127678600
內(nèi)核升級
https://www.topunix.com/post-4883.html
https://blog.csdn.net/inthat/article/details/117074180
刪除舊內(nèi)核
https://blog.csdn.net/weixin_45661908/article/details/123377496
centos-8.2文章來源:http://www.zghlxwxcb.cn/news/detail-779747.html
https://app.vagrantup.com/bento/boxes/centos-8.2文章來源地址http://www.zghlxwxcb.cn/news/detail-779747.html
到了這里,關(guān)于輕量級 K8S 環(huán)境、本地 K8S 環(huán)境Minikube,一鍵使用 (史上最全)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!