Kubernetes中文文檔
http://docs.kubernetes.org.cn/
目錄
一澈蚌、K8S由來(lái)
二氓侧、K8S特性
自動(dòng)裝箱
自我修復(fù)
水平擴(kuò)展
服務(wù)發(fā)現(xiàn)/負(fù)載均衡
自動(dòng)發(fā)布和回滾
密鑰和配置管理
存儲(chǔ)編排
批量處理執(zhí)行
三秉版、K8S的架構(gòu)
API Server
Scheduler
Controller-Manager
Kubelet
Kube-proxy
四燎悍、邏輯概念
Pod
Pod控制器
五沪羔、K8S網(wǎng)絡(luò)
六韧掩、通過(guò)kubeadm部署K8S集群
1. 環(huán)境準(zhǔn)備(所有節(jié)點(diǎn))
2. kubeadm初始化
3. 在master部署flannel
4. 擴(kuò)展Pod的副本個(gè)數(shù)
5. 配置kubectl子命令自動(dòng)補(bǔ)全
一、K8S由來(lái)
Kuberbetes簡(jiǎn)稱K8S旭等,是由Google的幾位工程師創(chuàng)立的酌呆,2014年6月首次對(duì)外公布。K8S的開(kāi)發(fā)深受谷歌內(nèi)部的一個(gè)叫做Borg系統(tǒng)的影響搔耕,Borg系統(tǒng)是谷歌內(nèi)部穩(wěn)定運(yùn)行了十幾年的大規(guī)模容器編排工具隙袁。谷歌沿用Borg系統(tǒng)的思路,用GO語(yǔ)言重新構(gòu)建了這個(gè)容器編排工具弃榨,并命名為Kubernetes菩收。
二、K8S特性
自動(dòng)裝箱
基于資源依賴鲸睛,以及其它約束坛梁,能夠自動(dòng)完成容器的部署而且不影響可用性。
自我修復(fù)
具有自愈能力腊凶,考慮到容器非常輕量級(jí)的特點(diǎn)划咐,一旦某個(gè)應(yīng)用容器崩潰了拴念,可以很快啟動(dòng)一個(gè)新的應(yīng)用容器替代褐缠。
水平擴(kuò)展
能夠?qū)崿F(xiàn)自動(dòng)水平擴(kuò)展政鼠,一個(gè)容器不夠,就再啟一個(gè)队魏,可以不斷的擴(kuò)展公般,只要你的物理平臺(tái)資源足夠。
服務(wù)發(fā)現(xiàn)/負(fù)載均衡
自動(dòng)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡
自動(dòng)發(fā)布和回滾
密鑰和配置管理
存儲(chǔ)編排
對(duì)存儲(chǔ)卷實(shí)現(xiàn)動(dòng)態(tài)供給胡桨。如某一個(gè)容器需要用到存儲(chǔ)卷時(shí)官帘,會(huì)根據(jù)容器的需求自動(dòng)創(chuàng)建符合要求的存儲(chǔ)卷
批量處理執(zhí)行
三、K8S的架構(gòu)
Kubernetes集群包含有節(jié)點(diǎn)代理Kubelet 和Master組件(APIs昧谊,scheduler刽虹,etc.),下面是K8S的架構(gòu)圖呢诬。
Master節(jié)點(diǎn)包含API Server涌哲、Scheduler(調(diào)度器)、ControllerManager(控制器管理器)這三個(gè)核心的組件尚镰。Node節(jié)點(diǎn)包含的核心組件有Kubelet阀圾、Docker容器引擎、Kube-proxy
API Server
負(fù)責(zé)接受請(qǐng)求狗唉,解析請(qǐng)求初烘,處理請(qǐng)求
Scheduler
調(diào)度器,它負(fù)責(zé)監(jiān)測(cè)每一個(gè)Node節(jié)點(diǎn)上的可用計(jì)算資源分俯,并根據(jù)用戶創(chuàng)建容器時(shí)的最小資源請(qǐng)求量去評(píng)估哪個(gè)Node節(jié)點(diǎn)最合適肾筐,就把容器創(chuàng)建在最合適的Node節(jié)點(diǎn)上。
Controller-Manager
負(fù)責(zé)監(jiān)控每一個(gè)Controller(控制器)的健康狀態(tài)澳迫,并確本殖荩控制器是健康的剧劝。而控制器是確保Pod健康的組件橄登。
Kubelet
是用于與Master節(jié)點(diǎn)的API Server進(jìn)行通信,并接受Master調(diào)度過(guò)來(lái)的各種任務(wù)并執(zhí)行的集群代理讥此。
Kube-proxy
負(fù)責(zé)管理Service
四拢锹、邏輯概念
Pod
K8S并不是直接調(diào)度容器,K8S中最小的調(diào)度單元是Pod萄喳。容器是運(yùn)行在Pod內(nèi)部的卒稳,并且一個(gè)Pod內(nèi)可以運(yùn)行多個(gè)容器,這多個(gè)容器共享同一個(gè)底層的網(wǎng)絡(luò)名稱空間他巨,它們共享底層的Net充坑、UTS减江、IPC三個(gè)名稱空間。另外三個(gè)名稱空間是互相隔離的:USER捻爷、MNT辈灼、PID。同一個(gè)Pod中的容器通過(guò)lo進(jìn)行通信也榄。同一個(gè)Pod中的容器還共享第二種資源:存儲(chǔ)卷巡莹。通常情況下一個(gè)Pod中只放一個(gè)容器,除非多個(gè)容器間有非常非常緊密的聯(lián)系甜紫。
K8S把Pod分為兩類:
- 自主式Pod降宅,是自我管理的,只在某個(gè)節(jié)點(diǎn)上運(yùn)行囚霸,一旦節(jié)點(diǎn)故障腰根,Pod就會(huì)丟失,不支持全局調(diào)度邮辽;
- 由控制器管理的Pod唠雕,它是由Pod控制器進(jìn)行管理的。
Pod控制器
常見(jiàn)的Pod控制器:
- ReplicationController (副本控制器)吨述,確保Pod的數(shù)量始終保持設(shè)定的個(gè)數(shù)岩睁。也支持Pod的滾動(dòng)更新。
- ReplicaSet (副本集)揣云,它不直接使用捕儒,有一個(gè)聲明式更新的控制器叫Deployment來(lái)負(fù)責(zé)管理。但是Deployment只能負(fù)責(zé)管理那些無(wú)狀態(tài)的應(yīng)用邓夕。
- StatefulSet (有狀態(tài)副本集)刘莹,負(fù)責(zé)管理有狀態(tài)的應(yīng)用。
- DaemonSet 焚刚,如果需要在每一個(gè)Node上只運(yùn)行一個(gè)副本点弯,而不是隨意運(yùn)行,就需要DaemonSet矿咕。
- Job抢肛,運(yùn)行作業(yè),對(duì)于時(shí)間不固定的操作碳柱,比如:某個(gè)應(yīng)用生成了一大堆數(shù)據(jù)集捡絮,現(xiàn)在需要臨時(shí)啟動(dòng)一個(gè)Pod去清理這些數(shù)據(jù)集,清理完成后莲镣,這個(gè)Pod就可以結(jié)束了福稳。 這些不需要一直處于運(yùn)行狀態(tài)的應(yīng)用,就用Job這個(gè)類型的控制器去控制瑞侮。如果Pod運(yùn)行過(guò)程中意外中止了的圆,Job負(fù)責(zé)重啟Pod症革。如果Pod任務(wù)執(zhí)行完了卦睹,就不需要再啟動(dòng)了涛救。
- Cronjob边败,周期性作業(yè)。
Deployment這種控制器還支持二級(jí)控制器叮称,叫HPA (HorizontalPodAutoscaler种玛,水平Pod自動(dòng)伸縮控制器)。當(dāng)業(yè)務(wù)量增長(zhǎng)瓤檐,一組Pod不足以支持業(yè)務(wù)時(shí)赂韵,HPA會(huì)自動(dòng)增加Pod數(shù)量,業(yè)務(wù)量下降后挠蛉,還會(huì)自動(dòng)減少Pod數(shù)量祭示。
五、K8S網(wǎng)絡(luò)
K8S中包含三種網(wǎng)絡(luò):
- 節(jié)點(diǎn)網(wǎng)絡(luò): 各個(gè)節(jié)點(diǎn)主機(jī)之間的通信網(wǎng)絡(luò)谴古;
- Service網(wǎng)絡(luò):也被稱為集群網(wǎng)絡(luò)质涛;
- Pod網(wǎng)絡(luò):Pod之間通信的網(wǎng)絡(luò)。
K8S通過(guò)CNI(Container Network Interface掰担,容器網(wǎng)絡(luò)接口)插件體系來(lái)接入外部的網(wǎng)絡(luò)解決方案汇陆。這些插件都應(yīng)該提供Service網(wǎng)絡(luò)和Pod網(wǎng)絡(luò)。
以下三種常用的CNI插件:
- flannel : 支持網(wǎng)絡(luò)配置带饱;是疊加網(wǎng)絡(luò)毡代。簡(jiǎn)單,但是不支持網(wǎng)絡(luò)策略勺疼;CoreOS開(kāi)源項(xiàng)目
- calico :支持網(wǎng)絡(luò)配置教寂、網(wǎng)絡(luò)策略;是三層遂道網(wǎng)絡(luò)执庐。缺點(diǎn):功能強(qiáng)大酪耕,但網(wǎng)絡(luò)配置較為復(fù)雜。
- canel : 是結(jié)合了flannel和calico的優(yōu)點(diǎn)轨淌,使用flannel的網(wǎng)絡(luò)配置迂烁、使用calico的網(wǎng)絡(luò)策略。
- 猿诸。婚被。狡忙。最常用的就是這三種梳虽,其他網(wǎng)絡(luò)插件不一一列舉。
以上這些網(wǎng)絡(luò)插件可以做為節(jié)點(diǎn)上的守護(hù)進(jìn)程運(yùn)行灾茁,也可以托管在K8S之上做為容器運(yùn)行窜觉。
六谷炸、通過(guò)kubeadm部署K8S集群
kubeadm是K8S官方提供的集群部署工具。kubeadm將master節(jié)點(diǎn)上的apiserver禀挫、scheduler旬陡、controller-manager、etcd和node節(jié)點(diǎn)上的kube-proxy都部署為Pod運(yùn)行语婴,所以master和node都需要安裝kubelet和docker描孟。
主機(jī)準(zhǔn)備:
主機(jī)名 | IP | 系統(tǒng) | 配置 |
---|---|---|---|
k8s-master.fhw.com | 192.168.100.135 | CentOS7.4 | 4C8G |
k8s-node1.fhw.com | 192.168.100.136 | CentOS7.4 | 2C8G |
k8s-node2.fhw.com | 192.168.100.137 | CentOS7.4 | 2C8G |
1. 環(huán)境準(zhǔn)備(所有節(jié)點(diǎn))
關(guān)閉防火墻和禁用selinux
systemctl stop firewalld
setenforce 0
準(zhǔn)備yum源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache fast
yum install -y vim wget net-tools lrzsz
cd /etc/yum.repos.d
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
準(zhǔn)備kubernetes的Yum源文件
[root@k8s-master yum.repos.d]# cat kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安裝docker
yum install docker-ce -y
修改docker啟動(dòng)配置文件,在[Service]
下加入如下內(nèi)容:
vim /usr/lib/systemd/system/docker.service
Environment="NO_PROXY=127.0.0.0/8,172.20.0.0/16,reg.fhw.com,192.168.100.0/24"
ExecStart=/usr/bin/dockerd --insecure-registry=reg.fhw.com --insecure-registry=192.168.100.0/24
Environment="NO_PROXY=192.168.100.0/24" # 將自己的鏡像倉(cāng)庫(kù)地址設(shè)置不通過(guò)代理訪問(wèn)
啟動(dòng)Docker
systemctl enable docker
systemctl start docker
確保以下兩個(gè)內(nèi)核參數(shù)為1:
[root@k8s-master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
[root@k8s-master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1
kubelet相關(guān)文件介紹:
[root@k8s-master ~]# rpm -ql kubelet
/etc/kubernetes/manifests # 清單目錄
/etc/sysconfig/kubelet # kubelet配置文件
/etc/systemd/system/kubelet.service # unit文件
/usr/bin/kubelet # 二進(jìn)制可執(zhí)行文件
設(shè)置kubelet開(kāi)機(jī)自啟
systemctl enable kubelet
此時(shí)砰左,因?yàn)楦鞣N配置還沒(méi)有初始化完成匿醒,初始化完成以后才能啟動(dòng)kubelet。
kubeadm init
相關(guān)參數(shù):
[root@k8s-master ~]# kubeadm init --help
Run this command in order to set up the Kubernetes master.
Usage:
kubeadm init [flags]
Flags:
--apiserver-advertise-address string API Server監(jiān)聽(tīng)的IP地址缠导,默認(rèn)是0.0.0.0
--apiserver-bind-port int32 API Server監(jiān)聽(tīng)的端口 (default 6443)
--apiserver-cert-extra-sans strings Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names.
--cert-dir string 保存和存儲(chǔ)證書的路徑廉羔。(default "/etc/kubernetes/pki")
--config string kubeadm配置文件的路徑。 警告:配置文件的使用是實(shí)驗(yàn)性的僻造。
--cri-socket string 指定要連接的CRI套接字憋他。 (default "/var/run/dockershim.sock")
--dry-run Don't apply any changes; just output what would be done.
--feature-gates string A set of key=value pairs that describe feature gates for various features. Options are:
Auditing=true|false (ALPHA - default=false)
CoreDNS=true|false (default=true)
DynamicKubeletConfig=true|false (ALPHA - default=false)
SelfHosting=true|false (ALPHA - default=false)
StoreCertsInSecrets=true|false (ALPHA - default=false)
-h, --help help for init
--ignore-preflight-errors strings 預(yù)檢查時(shí)忽略哪些錯(cuò)誤。Example: 'IsPrivilegedUser,Swap'. 值為“all”時(shí)髓削,忽略所有檢查到的錯(cuò)誤竹挡。
--kubernetes-version string 指定Kubernetes版本。 (default "stable-1.11")
--node-name string Specify the node name.
--pod-network-cidr string 指定Pod網(wǎng)絡(luò)的IP地址范圍立膛。 如果設(shè)置此迅,控制平面將自動(dòng)為每個(gè)節(jié)點(diǎn)分配CIDR。
--service-cidr string Service網(wǎng)絡(luò)使用的IP地址范圍旧巾。 (default "10.96.0.0/12")
--service-dns-domain string Use alternative domain for services, e.g. "myorg.internal". (default "cluster.local")
--skip-token-print Skip printing of the default bootstrap token generated by 'kubeadm init'.
--token string The token to use for establishing bidirectional trust between nodes and masters. The format is [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
--token-ttl duration The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire (default 24h0m0s)
Global Flags:
-v, --v Level log level for V logs
配置忽略Swap相關(guān)報(bào)錯(cuò)
[root@k8s-master ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
先拉取必要鏡像并重新打tag (只在master節(jié)點(diǎn)操作即可)
docker pull gcrxio/kube-apiserver-amd64:v1.11.3
docker pull gcrxio/kube-controller-manager-amd64:v1.11.3
docker pull gcrxio/kube-scheduler-amd64:v1.11.3
docker pull gcrxio/kube-proxy-amd64:v1.11.3
docker pull gcrxio/pause:3.1
docker pull gcrxio/etcd-amd64:3.2.18
docker pull gcrxio/coredns:1.1.3
docker tag gcrxio/kube-apiserver-amd64:v1.11.3 k8s.gcr.io/kube-apiserver-amd64:v1.11.3
docker tag gcrxio/kube-proxy-amd64:v1.11.3 k8s.gcr.io/kube-proxy-amd64:v1.11.3
docker tag gcrxio/kube-controller-manager-amd64:v1.11.3 k8s.gcr.io/kube-controller-manager-amd64:v1.11.3
docker tag gcrxio/kube-scheduler-amd64:v1.11.3 k8s.gcr.io/kube-scheduler-amd64:v1.11.3
docker tag gcrxio/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3
docker tag gcrxio/etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker tag gcrxio/pause:3.1 k8s.gcr.io/pause:3.1
k8s.gcr.io/pause:3.1
是為pod提供底層基礎(chǔ)的容器耸序,它僅為pod分配網(wǎng)絡(luò)名稱空間,IP地址鲁猩、主機(jī)名和存儲(chǔ)卷坎怪。
2. kubeadm初始化
kubeadm init --kubernetes-version=v1.11.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
出下如下截圖,表示初始化成功
生產(chǎn)環(huán)境中廓握,如圖中提示搅窿,用一個(gè)普通用戶配置后操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
測(cè)試環(huán)境我就直接用root操作了。
查看各組件狀態(tài)信息:
[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
在node1和node2執(zhí)行以下命令隙券,以加入k8s集群:
kubeadm join 192.168.100.135:6443 --token edsptl.yqqaxnrzg3n09bk8 --discovery-token-ca-cert-hash sha256:ce4ee322a957729cdb0f59ba9d6be15edd585ba1a7a605e6c5a70f54aadc7d2f --ignore-preflight-errors=Swap
# 拉鏡像和打tag男应,以下兩個(gè)鏡像是node節(jié)點(diǎn)運(yùn)行起來(lái)的必要鏡像
docker pull gcrxio/pause:3.1
docker pull gcrxio/kube-proxy-amd64:v1.11.3
docker tag gcrxio/pause:3.1 k8s.gcr.io/pause:3.1
docker tag gcrxio/kube-proxy-amd64:v1.11.3 k8s.gcr.io/kube-proxy-amd64:v1.11.3
在master節(jié)點(diǎn)查看節(jié)點(diǎn)信息,可以看到node1和node2已經(jīng)加入集群了:
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.fhw.com NotReady master 19m v1.11.3
k8s-node1.fhw.com NotReady <none> 48s v1.11.3
k8s-node2.fhw.com NotReady <none> 7s v1.11.3
之所為STATUS是NotReady (未就緒狀態(tài))娱仔,是因?yàn)槿鄙倬W(wǎng)絡(luò)插件flannel或calico沐飘。這里我們用flannel做為集群的網(wǎng)絡(luò)插件。
3. 在master部署flannel
# kubernetes 1.7以上的版本,可以直接執(zhí)行如下命令部署flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
出現(xiàn)下圖耐朴,并不表示flannel已經(jīng)部署成功了借卧。
此時(shí)在拉取flannel的鏡像,有點(diǎn)慢筛峭。铐刘。。影晓,等待flannel的pod變?yōu)镽unning狀態(tài)才是成功了镰吵。
從上圖還可以看出coredns的狀態(tài)為ImagePullBackOff
, 這表示鏡像拉取失敗了」仪可以通過(guò)命令kubectl describe pod coredns-78fcdf6894-dqjzn -n kube-system
查看Events
:
可以看到確實(shí)是拉取鏡像k8s.gcr.io/coredns:1.1.3
失敗了捡遍。
再看一下coredns的pod是部署在哪個(gè)節(jié)點(diǎn)上:
圖中是部署在node1節(jié)點(diǎn),再查看另一個(gè)coredns 的pod是部署在哪個(gè)節(jié)點(diǎn)上竹握。然后在對(duì)應(yīng)的節(jié)點(diǎn)主機(jī)上手動(dòng)拉取鏡像画株。
解決方法如下:
# 拉取coredns的鏡像再重新打tag
docker pull coredns/coredns:1.1.3
docker tag coredns/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3
鏡像拉下來(lái)后,過(guò)一會(huì)再次查看coredns的狀態(tài)是否為Running
再看看各個(gè)節(jié)點(diǎn)狀態(tài)
三個(gè)節(jié)點(diǎn)都已經(jīng)是Ready狀態(tài)了啦辐。
4. 擴(kuò)展Pod的副本個(gè)數(shù)
獲取deployment
[root@k8s-master .kube]# kubectl get deployment -n kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
coredns 2 2 2 0 14h
AVAILABLE
為0表示coredns可用的pod個(gè)數(shù)為0谓传,也就是部署兩個(gè)coredns pod都沒(méi)有成功,原因就是第3小節(jié)中coredns的鏡像拉取失敗造成的芹关。
擴(kuò)展pod數(shù)量
[root@k8s-master .kube]# kubectl scale --replicas=3 deployment/coredns -n kube-system
deployment.extensions/coredns scaled
coredns鏡像拉取失敗的問(wèn)題解決后续挟,再次查看deployment:
[root@k8s-master ~]# kubectl get deployment -n kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
coredns 3 3 3 3 14h
此時(shí)3個(gè)coredns pod都正常運(yùn)行,
AVAILABLE
值變?yōu)?了侥衬。
5. 配置kubectl子命令自動(dòng)補(bǔ)全
先確認(rèn)當(dāng)前shell
[root@k8s-master ~]# echo $SHELL
/bin/bash
安裝必要的包
yum install bash-completion -y
# 當(dāng)前shell為bash:
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
# 如果當(dāng)前shell為zsh:
source <(kubectl completion zsh)
echo "source <(kubectl completion zsh)" >> ~/.bashrc
6. 部署K8S Dashboard
6.1 部署
在Github上: https://github.com/kubernetes/dashboard 在這個(gè)頁(yè)面上獲取部署K8S Dashboard的命令:
先將kubernetes-dashboard.yaml下載下來(lái)诗祸,修改一些東西
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
修改鏡像為siriuszg/kubernetes-dashboard-amd64:v1.10.0
,
修改Service類型為NodePort
轴总,這樣可以從K8S集群外部訪問(wèn)Dashboard直颅;添加nodePort: 30001
, 指定外部訪問(wèn)時(shí)用的端口。
執(zhí)行如下命令部署Kubernetes Dashboard:
kubectl apply -f kubernetes-dashboard.yaml
注意:以上命令依賴谷歌的鏡像:
k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
怀樟,國(guó)內(nèi)因?yàn)榫W(wǎng)絡(luò)原因無(wú)法正常拉取此鏡像功偿。通過(guò)如下命令生成所需要的鏡像:
如果遇到如下問(wèn)題,注意查檢firewalld服務(wù)是否停用往堡。
Error while initializing connection to Kubernetes apiserver. This most likely means that the cluster is misconfigured (e.g., it has invalid apiserver certificates or service account's configuration) or the --apiserver-host param points to a server that does not exist. Reason: Get https://10.96.0.1:443/version: dial tcp 10.96.0.1:443: getsockopt: no route to host
停止firewalld服務(wù):
systemctl stop firewalld
,systemctl disable firewalld
, firewalld服務(wù)啟動(dòng)會(huì)影響K8S集群中的Pod之間相互訪問(wèn)械荷。
獲取kubernetes-dashboard的Service
瀏覽器訪問(wèn):https://192.168.100.135:30001/,出現(xiàn)下圖界面
這表明Dashboard已經(jīng)成功部署虑灰,接下來(lái)配置認(rèn)證信息吨瞎。
6.2 配置認(rèn)證信息
從上圖中可以看出有Kubeconfig
和令牌
兩種認(rèn)證方法。
認(rèn)證時(shí)的賬號(hào)必須為ServiceAccount: 被Dashboard Pod拿來(lái)由Kubernetes進(jìn)行認(rèn)證穆咐。
令牌認(rèn)證(也就是token認(rèn)證)
創(chuàng)建ServiceAccount颤诀,根據(jù)其管理目標(biāo),使用rolebinding或clusterrolebinding綁定至合理的role或clusterrole。
創(chuàng)建serviceaccount
kubectl create serviceaccount dashboard-admin -n kube-system
將dashboard-admin
與集群管理員建立綁定關(guān)系
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
--serviceaccount=NAMESPACE:SERVICEACCOUNT
獲取dashboard-admin這個(gè)serviceaccount的secret信息:
[root@k8s-master ~]# kubectl get secrets -n kube-system | grep dashboard-admin
dashboard-admin-token-fg5s8 kubernetes.io/service-account-token 3 7m
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl describe secrets dashboard-admin-token-fg5s8 -n kube-system
Name: dashboard-admin-token-fg5s8
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=dashboard-admin
kubernetes.io/service-account.uid=0f74c4f6-d2d7-11e8-8078-000c29eced73
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZmc1czgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMGY3NGM0ZjYtZDJkNy0xMWU4LTgwNzgtMDAwYzI5ZWNlZDczIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.RzDorq-mQ8Mwb75LGKKC4vd5SRzxq7d7GxD9pG43xi4WCoftiIIBI38WvWGBn5MXYYFVwDqjkNfLMJStMTXiJomlLd7xJtGphdHJ8PR-jnyIGksDiNFicUOKjG7k6OGkKbCfIPb0cPglcNfceO8aNzRadiTasgoXLyxCpYRQd6kH4rx4UVLUWkEjWYTG4PNkNVjA4duRZ2FuKCdpqhysGwiQo9RMzUF9rTQToCQlu-N-UmsRqsGDAnx6GuZNX5BC97Yrzw1iRiFboekm2-RtGZPYczkVN7N9cP4GQPaNfoPVSpNPDx-y-Go_XqENdiniPQzwq9cUFON1l177hyo_RQ
上述輸出結(jié)果中的token就是服務(wù)賬戶dashboard-admin的認(rèn)證令牌着绊。將token的值復(fù)制至瀏覽器登錄。
登錄成功熟尉。
創(chuàng)建Kubeconfig認(rèn)證
這里我們創(chuàng)建一個(gè)只對(duì)default
這個(gè)名稱空間有操作權(quán)限的賬戶归露。
創(chuàng)建一個(gè)serviceaccount
[root@k8s-master ~]# kubectl create serviceaccount def-ns-admin -n default
serviceaccount/def-ns-admin created
由于我們想讓def-ns-admin這個(gè)賬號(hào)只對(duì)default名稱空間有管理員權(quán)限,所以必須用rolebinding去綁定role斤儿,這樣這個(gè)賬號(hào)才只對(duì)這一個(gè)名稱空間有管理員權(quán)限剧包。
[root@k8s-master ~]# kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin
rolebinding.rbac.authorization.k8s.io/def-ns-admin created
這里我把rolebinding和serviceaccount都命名為
def-ns-admin
,不要搞混淆了往果。
獲取def-ns-admin的secret疆液,利用它的token來(lái)生成kubeconfig文件:
[root@k8s-master ~]# kubectl get secrets | grep def-ns-admin
def-ns-admin-token-6jr4v kubernetes.io/service-account-token 3 9m
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl describe secrets def-ns-admin-token-6jr4v
Name: def-ns-admin-token-6jr4v
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name=def-ns-admin
kubernetes.io/service-account.uid=02d5e211-d2d9-11e8-8078-000c29eced73
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZi1ucy1hZG1pbi10b2tlbi02anI0diIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWYtbnMtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMmQ1ZTIxMS1kMmQ5LTExZTgtODA3OC0wMDBjMjllY2VkNzMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZWYtbnMtYWRtaW4ifQ.nrNVbuxrJra-cp3BOnWPzfbeQc_0Xe1E0xVzkDkxY6rJ9HexP4fbJIBvUmiqWyoFs5Yq9TT9wRQ_6kaOus0wjcjd7HWx5ZZzui-_UyQzvc3PRqwvWvn11ldLLHAz-7CM37Bcmm-eorj3JOeDvJF4OiloKiAPZ-9xxMQagqckSfa_VB7GGfOzOuRiRSi_fbC5ii81qCvAZxwgqIKFDhUUhXICOQVnZEW5FxMPdZAvYNziug6Ze7iPiAhFysq4ErUHBXzV6D1jghjNYiq01WkAbCmz7uLj7JVatJB9K28da-Wqc6cEBrP80uAfky9f4kz0SglxwqFVrXTd8X_GMqjd2Q
set-cluster
[root@k8s-master pki]# kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server="https://192.168.100.135:6443" --embed-certs=true --kubeconfig=/root/def-ns-admin.conf
Cluster "kubernetes" set.
查看:
[root@k8s-master pki]# kubectl config view --kubeconfig=/root/def-ns-admin.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://192.168.100.135:6443
name: kubernetes
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []
set-credentials
[root@k8s-master ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secrets def-ns-admin-token-6jr4v -o jsonpath={.data.token} | base64 -d)
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl config set-credentials def-ns-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/def-ns-admin.conf
User "def-ns-admin" set.
查看
set-context
kubectl config set-context def-ns-admin@kubernetes --cluster=kubernetes --user=def-ns-admin --kubeconfig=/root/def-ns-admin.conf
Context "def-ns-admin@kubernetes" created.
查看
use-context
[root@k8s-master ~]# kubectl config use-context def-ns-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf
Switched to context "def-ns-admin@kubernetes".
現(xiàn)在/root/def-ns-admin.conf這個(gè)文件就可以做為Kubeconfig認(rèn)證的文件了。
將def-ns-admin.conf這個(gè)文件復(fù)制至瀏覽器所在系統(tǒng)上陕贮。使用Kubeconfig認(rèn)證方式:
成功登錄堕油,并且只對(duì)default名稱空間有管理權(quán)限: