gwt 網(wǎng)站開(kāi)發(fā)廈門(mén)人才網(wǎng)唯一官網(wǎng)
kind
- 簡(jiǎn)介
- kind 架構(gòu)
- 安裝 Kind (必備工具)
- docker官網(wǎng)
- kubectl官網(wǎng)
- kind官網(wǎng)
- 校驗(yàn)安裝結(jié)果
- 關(guān)于kind 命令
- 安裝一個(gè)集群
- 查看當(dāng)前 Kubernetes 集群中的節(jié)點(diǎn)信息。
- 查看當(dāng)前命名空間下中的Pod(容器實(shí)例)的信息。
- 使用 kind create cluster 安裝,關(guān)于安裝方式
- 查看當(dāng)前集群運(yùn)行組件
- 查看一下 kind 下面是基礎(chǔ)容器內(nèi)部的 /kind 目錄
- 關(guān)于: Kubelet、kubeadm 和 kubectl
- 關(guān)于"Weave"
- 創(chuàng)建集群
- 查看當(dāng)前擁有哪些集群
- 刪除某個(gè)集群
- 通過(guò)yaml 文件創(chuàng)建集群
- 端口暴露
- 搭建集群 帶端口映射
- 部署nginx測(cè)試
- 創(chuàng)建集群搭建 kubernetes-dashboard 控制臺(tái)
- 創(chuàng)建 kubernetes-dashboard .yaml
- 配置 dashboard-config.yaml
- 確認(rèn) kubernetes-dashboard.yaml 映射情況
- 創(chuàng)建集群
- 如果沒(méi)有設(shè)置nodePort 會(huì)報(bào)錯(cuò) not be used when `type` is 'ClusterIP'
- 創(chuàng)建Secret - service-account-secret.yaml
- 應(yīng)用權(quán)限并拿到token
- thisisunsafe
- java鏈接kind 創(chuàng)建的k8s
- 關(guān)于IPv4和IPv6
- k8s概念
- 先說(shuō)一下常用命令
- get常用命令
- config常用命令
- apply 常用命令
- 關(guān)于k8s整體概念
簡(jiǎn)介
kind 是 Kubernetes in Docker 的簡(jiǎn)寫(xiě),是一個(gè)使用 Docker 容器作為 Nodes,在本地創(chuàng)建和運(yùn)行 Kubernetes 群集的工具。適用于在本機(jī)創(chuàng)建 Kubernetes 群集環(huán)境進(jìn)行開(kāi)發(fā)和測(cè)試。
官網(wǎng):https://kind.sigs.k8s.io/
kind 由以下組件構(gòu)成:
- Go packages implementing cluster creation, image build, etc.
- A command line interface (kind) built on these packages.
- Docker image(s) written to run systemd, Kubernetes, etc.
- kubetest integration also built on these packages (WIP)
kind 使用 kubeadm 創(chuàng)建和啟動(dòng)群集節(jié)點(diǎn)。
kind 架構(gòu)
kind 官方架構(gòu)圖如下,它將 docker 容器作為 kubernetes 的 “node”,并在該 “node” 中安裝 kubernetes 組件,包括一個(gè)或者多個(gè) Control Plane 和 一個(gè)或者多個(gè) Work nodes。這就解決了在本機(jī)運(yùn)行多個(gè) node 的問(wèn)題,而不需要虛擬化 (sysin)。
安裝 Kind (必備工具)
docker官網(wǎng)
yum -y install yum-utils device-mapper-persistent-datalvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum makecache fastyum install docker-ce docker-ce-cli containerd.iosystemctl start dockersystemctl enable dockerdocker run hello-world
kubectl官網(wǎng)
kubectl 是Kubernetes的命令行工具,可以讓我們通過(guò)命令訪問(wèn)、操作、管理Kubernetes集群。brew安裝方法如下
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"mv kubectl /usr/local/bin/kubectl
kind官網(wǎng)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
# 如果安裝不了 用下面的
chmod +x ./kind
mv ./kind /usr/local/bin/kind
校驗(yàn)安裝結(jié)果
kubectl version --client
kind version
關(guān)于kind 命令
- build 用來(lái)從 k8s source 構(gòu)建一個(gè)鏡像。
- create、delete 創(chuàng)建、刪除集群。
- export 命令目前只有一個(gè) logs 選項(xiàng),作用是將內(nèi)部所有容器的日志拷貝到宿主機(jī)的某個(gè)目錄下。
- get 查看當(dāng)前有哪些集群,哪些節(jié)點(diǎn),以及 kubectl 配置文件的地址
- load 可以從宿主機(jī)向 k8s 容器內(nèi)導(dǎo)入鏡像。
安裝一個(gè)集群
kind create cluster
export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info
查看當(dāng)前 Kubernetes 集群中的節(jié)點(diǎn)信息。
kubectl get node
查看當(dāng)前命名空間下中的Pod(容器實(shí)例)的信息。
kubectl get namespace
kubectl get po -A
kubectl get po -n kube-system
使用 kind create cluster 安裝,關(guān)于安裝方式
從安裝打印出的輸出來(lái)看,分為4步:
- 查看本地上是否存在一個(gè)基礎(chǔ)的安裝鏡像,默認(rèn)是 kindest/node:v1.13.4,這個(gè)鏡像里面包含了需要安裝的所有東西,包括了 kubectl、kubeadm、kubelet 二進(jìn)制文件,以及安裝對(duì)應(yīng)版本 k8s 所需要的鏡像
- 準(zhǔn)備你的 node,這里就是做一些啟動(dòng)容器、解壓鏡像之類的工作
- 生成對(duì)應(yīng)的 kubeadm 的配置,之后通過(guò) kubeadm 安裝,安裝之后還會(huì)做另外的一些操作,比如像我剛才僅安裝單節(jié)點(diǎn)的集群,會(huì)幫你刪掉 master 節(jié)點(diǎn)上的污點(diǎn),否則對(duì)于沒(méi)有容忍的 pod 無(wú)法部署。
- 啟動(dòng)完畢
查看當(dāng)前集群運(yùn)行組件
kubectl get po -n kube-system
默認(rèn)方式啟動(dòng)的節(jié)點(diǎn)類型是 control-plane 類型,包含了所有的組件
- 兩個(gè)coredns
- etcd
- api-server
- controller-manager
- kube-proxy
- sheduler
- 網(wǎng)絡(luò)插件方面默認(rèn)使用的是 weave
查看一下 kind 下面是基礎(chǔ)容器內(nèi)部的 /kind 目錄
進(jìn)入容器
docker exec -it kind-control-plane /bin/bashcd /bin
- 在 bin 目錄下安裝了 kubelet、kubeadm、kubectl 這些二進(jìn)制文件
- 在images 下面是鏡像的 tar 包,kind 在啟動(dòng)基礎(chǔ)鏡像后會(huì)執(zhí)行一遍 docker load 操作將這些 tar 包導(dǎo)入
- 在manifests 下面是 weave 的 cni
關(guān)于: Kubelet、kubeadm 和 kubectl
Kubelet、kubeadm 和 kubectl 是 Kubernetes 生態(tài)系統(tǒng)中的三個(gè)關(guān)鍵組件,各自具有不同的功能和職責(zé)。
- Kubelet: Kubelet 是運(yùn)行在每個(gè) Kubernetes 節(jié)點(diǎn)上的組件,負(fù)責(zé)管理和控制節(jié)點(diǎn)上的容器。它與容器運(yùn)行時(shí)(如 Docker、containerd)交互,確保 Pod 的容器在節(jié)點(diǎn)上正確創(chuàng)建、啟動(dòng)、停止和刪除。Kubelet 還與 Kubernetes 控制平面交互,匯報(bào)節(jié)點(diǎn)狀態(tài)和接收分配給節(jié)點(diǎn)的任務(wù)。
- Kubeadm: Kubeadm 是 Kubernetes 官方提供的用于部署和管理 Kubernetes 集群的工具。它簡(jiǎn)化了 Kubernetes 集群的初始化過(guò)程,幫助管理員在幾個(gè)節(jié)點(diǎn)上快速創(chuàng)建一個(gè)穩(wěn)定的、符合最佳實(shí)踐的集群。Kubeadm 處理集群的引導(dǎo)、證書(shū)生成、網(wǎng)絡(luò)配置、設(shè)置控制平面組件等任務(wù),使得集群部署變得更加容易。
- Kubectl: kubectl 是 Kubernetes 的命令行工具,用于與 Kubernetes 集群進(jìn)行交互和管理。它是與 Kubernetes API 通信的主要方式,允許用戶執(zhí)行各種操作,如創(chuàng)建、刪除和管理資源(如 Pod、Service、Deployment 等)、查看集群狀態(tài)、進(jìn)行日志和調(diào)試等。kubectl 是與 Kubernetes 交互的主要入口。
綜上所述,Kubelet 是在每個(gè)節(jié)點(diǎn)上運(yùn)行的組件,負(fù)責(zé)管理和控制容器;kubeadm 是用于部署和初始化 Kubernetes 集群的工具;kubectl 是用于與 Kubernetes 集群進(jìn)行交互和管理的命令行工具。它們各自扮演著不同的角色,共同構(gòu)建和管理 Kubernetes 集群。
關(guān)于"Weave"
Weave是一種 Kubernetes 網(wǎng)絡(luò)插件,它提供了一個(gè)容器網(wǎng)絡(luò)接口(Container Networking Interface,CNI)的實(shí)現(xiàn)。
- CNI 是 Kubernetes 中用于管理容器網(wǎng)絡(luò)的標(biāo)準(zhǔn)接口,它定義了一組規(guī)范和API,用于在容器運(yùn)行時(shí)環(huán)境中創(chuàng)建、配置和連接容器網(wǎng)絡(luò)。CNI 插件負(fù)責(zé)實(shí)現(xiàn)這些規(guī)范和API,以便 Kubernetes 能夠?yàn)槿萜魈峁┚W(wǎng)絡(luò)功能。
- “Weave CNI” 是基于 Weave 網(wǎng)絡(luò)的 CNI 插件。它使用 Weave 的技術(shù)和協(xié)議來(lái)創(chuàng)建和管理容器網(wǎng)絡(luò)。當(dāng)您在 Kubernetes 中使用 Weave CNI 時(shí),它將負(fù)責(zé)在各個(gè)節(jié)點(diǎn)上創(chuàng)建和配置網(wǎng)絡(luò)接口,使得容器能夠在集群中進(jìn)行通信。
Weave CNI 提供了一種簡(jiǎn)單而靈活的容器網(wǎng)絡(luò)解決方案,它能夠自動(dòng)創(chuàng)建虛擬網(wǎng)絡(luò),并在不同節(jié)點(diǎn)上的容器之間建立安全的通信通道。它還支持網(wǎng)絡(luò)策略和服務(wù)發(fā)現(xiàn)等功能,使您能夠?qū)θ萜骶W(wǎng)絡(luò)進(jìn)行更精細(xì)的控制和管理。
總而言之,通過(guò)使用 Weave CNI 插件,您可以輕松地在 Kubernetes 集群中創(chuàng)建和管理容器網(wǎng)絡(luò),實(shí)現(xiàn)容器之間的通信和連接。
創(chuàng)建集群
從上訴下載的文檔來(lái)看默認(rèn)安裝的集群只帶上了一個(gè)控制節(jié)點(diǎn)
默認(rèn)的群集名稱為kind,使用參數(shù)–name指定創(chuàng)建的群集的名稱,可以創(chuàng)建多個(gè)群集:
在 node 中可以配置的不是很多,除了 role 另外的可以更改 node 使用的鏡像,不過(guò)我還是使用默認(rèn)的鏡像創(chuàng)建集群
# default
kind create cluster --image kindest/node:latest
# 1.20.0
kind create cluster --image kindest/node:v1.20.0
因?yàn)榍懊嬉呀?jīng)創(chuàng)建了kind 所以命令如下 使用默認(rèn)景象,創(chuàng)建為kind-test2 集群
kind create cluster --name kind-2
查看當(dāng)前擁有哪些集群
通過(guò) kind get clusters
可以看到當(dāng)前有兩個(gè)集群
既然有兩個(gè)集群,可以通過(guò)集群切換到指定對(duì)應(yīng)集群處理。kind-集群
# 切換到群集`kind`
kubectl cluster-info --context kind-kind# 切換到群集`kind-2`
kubectl cluster-info --context kind-kind-2
刪除某個(gè)集群
kind get clusters # 指定刪除某個(gè)kind delete cluster --name kind# 刪除全部kind delete cluster --all
通過(guò)yaml 文件創(chuàng)建集群
- 首先刪除所有集群
kind delete cluster --all
- 創(chuàng)建配置文件 kind-config.yaml
vim kind-config.yaml
- 創(chuàng)建集群 兩個(gè)節(jié)點(diǎn) 一個(gè)平面
apiVersion: kind.sigs.k8s.io/v1alpha3
kind: Cluster
nodes:- role: control-plane- role: worker- role: worker
kind create cluster --name multi-node --config=kind-config.yaml
端口暴露
docker ps
在這里我被坑了好久,127.0.0.1:38884 映射容器里里面的k8s 6443 導(dǎo)致后無(wú)法訪問(wèn)serviceApi 6443端口,因?yàn)樗镜氐?2.0.0.1的ip4網(wǎng)段,這個(gè)后面會(huì)說(shuō)
127.0.0.1:38884->6443/tcp
目前可以看到只有33884這個(gè)端口可以從外部訪問(wèn),用kind創(chuàng)建K8s時(shí),相當(dāng)在本地運(yùn)行了一個(gè)容器,而K8s Cluster就運(yùn)行在這個(gè)容器中。
所以,如果我想從外部訪問(wèn)kind K8s的話,就需要把這個(gè)容器的端口(K8s的端口)暴露出來(lái)。首先刪除所有 k8s cluster
kind delete cluster --all
搭建集群 帶端口映射
vim kind-single #創(chuàng)建一個(gè)測(cè)試單節(jié)點(diǎn)集群
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 80hostPort: 8001protocol: TCP
創(chuàng)建單節(jié)點(diǎn)集群腳本 主機(jī)端口 8001 映射到內(nèi)部容器 80
關(guān)于于 ingress-ready=true 需要解釋一下
- role: control-plane 表示該節(jié)點(diǎn)將作為控制平面節(jié)點(diǎn)運(yùn)行。
- kubeadmConfigPatches 是一個(gè)配置補(bǔ)丁列表,用于向節(jié)點(diǎn)的 kubeadm 配置添加額外的配置項(xiàng)。
- kind: InitConfiguration 表示正在修改節(jié)點(diǎn)的初始化配置。
- nodeRegistration 部分用于修改節(jié)點(diǎn)注冊(cè)的相關(guān)配置。
- kubeletExtraArgs 是一個(gè)用于在節(jié)點(diǎn)的 kubelet 配置中添加額外參數(shù)的字段。在這個(gè)例子中,我們添加了一個(gè) node-labels 參數(shù),并將它設(shè)置為 “ingress-ready=true”。
“ingress-ready=true” 下面擴(kuò)展端口映射確保只將流量發(fā)送到已準(zhǔn)備好的節(jié)點(diǎn)上
kind create cluster --name tsk8s --config /usr/local/kind-config/kind-single
部署nginx測(cè)試
切換到當(dāng)前 kind
kubectl cluster-info --context kind-kind
docker ps
創(chuàng)建一個(gè)需要部署的應(yīng)用 nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: web-nginxname: web-nginx-Deployment
spec:replicas: 3selector:matchLabels:app: web-nginxtemplate:metadata:labels:app: web-nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: web-nginx
spec:selector:app: web-nginxtype: NodePortports:- port: 80nodePort: 30080
這是一個(gè) Kubernetes 的 YAML 配置文件示例,描述了一個(gè) Deployment 和一個(gè) Service 的定義。
- apiVersion: apps/v1 和 apiVersion: v1 分別指定了所使用的 Kubernetes API 的版本。apps/v1 表示使用的是 Apps API 的 v1 版本,而 v1 表示使用的是核心 API 的 v1 版本。
- kind: Deployment 和 kind: Service 定義了資源的類型。
- Deployment 表示定義一個(gè) Deployment 資源,用于管理應(yīng)用程序的副本。
- Service 表示定義一個(gè) Service 資源,用于暴露應(yīng)用程序的網(wǎng)絡(luò)服務(wù)。
- metadata 區(qū)域包含元數(shù)據(jù)信息,如資源的標(biāo)簽和名稱。
- spec 區(qū)域定義了資源的規(guī)范或配置。
對(duì)于 Deployment 部分:
- replicas: 3 指定了要?jiǎng)?chuàng)建的副本數(shù)量為 3。
- selector 指定了用于選擇要進(jìn)行部署的 Pod 的標(biāo)簽。
- template 定義了要?jiǎng)?chuàng)建的 Pod 的模板,其中包含了 Pod 的標(biāo)簽、容器以及相關(guān)的配置信息。
在 containers 下的
- image: nginx 指定了要使用的容器鏡像
- name: nginx 為容器命名,
- ports 下的 - containerPort: 80 指定了容器監(jiān)聽(tīng)的端口號(hào)為 80。
對(duì)于 Service 部分: - selector 指定了要將該 Service 與哪些 Pod 進(jìn)行關(guān)聯(lián),通過(guò)匹配標(biāo)簽 app: web-nginx。
- type: NodePort 表示 Service 類型為 NodePort,可以通過(guò)任意節(jié)點(diǎn)的 IP 和指定的 NodePort 來(lái)訪問(wèn)該 Service。
- ports 下的 - port: 80 指定了 Service 其他 Pod 可以通過(guò)的端口號(hào)為 80,nodePort: 30080 指定了節(jié)點(diǎn)上的端口號(hào)為 30080,用于外部訪問(wèn) Service。
這個(gè)配置文件描述了一個(gè)使用 Nginx 鏡像構(gòu)建的 Deployment 和一個(gè)相關(guān)的 Service,用于管理和暴露一個(gè)名為 web-nginx 的應(yīng)用程序。
執(zhí)行以下命令啟動(dòng)應(yīng)用部署3個(gè)pod單位的nginx 本次發(fā)布部署為 web-nginx-Deployment
kubectl create -f nginx.yaml
http://你的主機(jī):30070/ . 可以看到
創(chuàng)建集群搭建 kubernetes-dashboard 控制臺(tái)
可能你會(huì)需要kubernetes的控制臺(tái)
創(chuàng)建 kubernetes-dashboard .yaml
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.apiVersion: v1
kind: Namespace
metadata:name: kubernetes-dashboard---apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443selector:k8s-app: kubernetes-dashboard---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-certsnamespace: kubernetes-dashboard
type: Opaque---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-csrfnamespace: kubernetes-dashboard
type: Opaque
data:csrf: ""---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-key-holdernamespace: kubernetes-dashboard
type: Opaque---kind: ConfigMap
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-settingsnamespace: kubernetes-dashboard---kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
rules:# Allow Dashboard to get, update and delete Dashboard exclusive secrets.- apiGroups: [""]resources: ["secrets"]resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]verbs: ["get", "update", "delete"]# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.- apiGroups: [""]resources: ["configmaps"]resourceNames: ["kubernetes-dashboard-settings"]verbs: ["get", "update"]# Allow Dashboard to get metrics.- apiGroups: [""]resources: ["services"]resourceNames: ["heapster", "dashboard-metrics-scraper"]verbs: ["proxy"]- apiGroups: [""]resources: ["services/proxy"]resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]verbs: ["get"]---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard
rules:# Allow Metrics Scraper to get metrics from the Metrics server- apiGroups: ["metrics.k8s.io"]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: kubernetes-dashboardtemplate:metadata:labels:k8s-app: kubernetes-dashboardspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: kubernetes-dashboardimage: kubernetesui/dashboard:v2.5.0imagePullPolicy: Alwaysports:- containerPort: 8443protocol: TCPargs:- --auto-generate-certificates- --namespace=kubernetes-dashboard# Uncomment the following line to manually specify Kubernetes API server Host# If not specified, Dashboard will attempt to auto discover the API server and connect# to it. Uncomment only if the default does not work.# - --apiserver-host=http://my-address:portvolumeMounts:- name: kubernetes-dashboard-certsmountPath: /certs# Create on-disk volume to store exec logs- mountPath: /tmpname: tmp-volumelivenessProbe:httpGet:scheme: HTTPSpath: /port: 8443initialDelaySeconds: 30timeoutSeconds: 30securityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001volumes:- name: kubernetes-dashboard-certssecret:secretName: kubernetes-dashboard-certs- name: tmp-volumeemptyDir: {}serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule---kind: Service
apiVersion: v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:ports:- port: 8000targetPort: 8000selector:k8s-app: dashboard-metrics-scraper---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: dashboard-metrics-scrapertemplate:metadata:labels:k8s-app: dashboard-metrics-scraperspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: dashboard-metrics-scraperimage: kubernetesui/metrics-scraper:v1.0.7ports:- containerPort: 8000protocol: TCPlivenessProbe:httpGet:scheme: HTTPpath: /port: 8000initialDelaySeconds: 30timeoutSeconds: 30volumeMounts:- mountPath: /tmpname: tmp-volumesecurityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulevolumes:- name: tmp-volumeemptyDir: {}
配置 dashboard-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 31000hostPort: 31000protocol: TCP
查看端口映射情況
docker ps
0.0.0.0:31000->31000/tcp, 127.0.0.1:35017->6443/tcp
確認(rèn) kubernetes-dashboard.yaml 映射情況
節(jié)點(diǎn)映射 31000. 設(shè)置類型為nodePort 供外部訪問(wèn)
spec:type: NodePortselector:app: kubernetes-dashboardports:- port: 443targetPort: 8443nodePort:31000protocol: TCP
創(chuàng)建集群
kind create cluster --name kind-dashboard --config=/usr/local/kind-config/cluster/dashboard-cluster-config.yaml
切換到當(dāng)前容器
kubectl cluster-info --context kind-kind-dashboard
應(yīng)用 Dashboard
kubectl apply -f /usr/local/kind-config/kubernetes-dashboard.yaml
如果沒(méi)有設(shè)置nodePort 會(huì)報(bào)錯(cuò) not be used when type
is ‘ClusterIP’
The Service "kubernetes-dashboard" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'
表明在 Service 對(duì)象的定義中,當(dāng) type 字段設(shè)置為 ClusterIP 時(shí),不允許使用 nodePort 字段。nodePort 字段是用于 NodePort 類型的 Service,而不是 ClusterIP 類型的 Service。
為了解決這個(gè)問(wèn)題,您可以考慮以下兩種方法之一:
- 修改 Service 對(duì)象的 type 字段為 NodePort:
- 如果您只需要 ClusterIP 類型的 Service,請(qǐng)刪除 nodePort 字段:
因?yàn)槭切薷膁ashboard.yaml service 端口映射,如果沒(méi)有類型默認(rèn)是 類型 所以要修改一下
創(chuàng)建Secret - service-account-secret.yaml
# 在kubernetes-dashboard命名空間下創(chuàng)建名為 admin-user 的服務(wù)賬戶
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard---# 將服務(wù)賬戶admin-user綁定到內(nèi)置的ClusterRole集群角色cluster-admin上, 實(shí)現(xiàn)授權(quán)
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---# 對(duì)名為admin-user的服務(wù)賬戶手動(dòng)創(chuàng)建Secret
apiVersion: v1
kind: Secret
metadata:name: admin-user-secretnamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
也可以不創(chuàng)建但是需要,創(chuàng)建 ClusterRoleBinding 獲得群集 admin 訪問(wèn)權(quán)限:都是一樣的,這個(gè)后面說(shuō)
應(yīng)用權(quán)限并拿到token
kubectl apply -f /usr/local/kind-config/service-account-secret.yaml
通過(guò)service-account-secret.yaml配置文件,給kubernetes-dashboard命名空間下名為admin-user的服務(wù)賬戶手動(dòng)創(chuàng)建了一個(gè)名為admin-user-secret的Secret。現(xiàn)在可以通過(guò)該Secret獲取相應(yīng)的Token。通過(guò)kubectl describe、kubectl get兩種方式獲取。
kubectl describe secret admin-user-secret -n kubernetes-dashboard
查看是否ok
kubectl get po,svc -n kubernetes-dashboard
service 上面有對(duì)應(yīng)的端口映射,我們前文已經(jīng)暴露了,所以31000應(yīng)該打service的31000
如果不想像上面一樣拿token獲取,還有一種,不過(guò)前期學(xué)習(xí)不建議,操作如下
- 創(chuàng)建 ClusterRoleBinding 獲得群集 admin 訪問(wèn)權(quán)限:
kubectl create clusterrolebinding default-admin --clusterrole cluster-admin --serviceaccount=default:default
#提示:
clusterrolebinding.rbac.authorization.k8s.io/default-admin created
- 創(chuàng)建登錄 Dashboard 的 token:
token=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)
- 拿到token
echo $token
最后訪問(wèn):https://你的主機(jī)ip:31000/。拿到對(duì)應(yīng)的token去訪問(wèn),如果訪問(wèn)為不安全的的可能是證書(shū)問(wèn)題,如何解決
thisisunsafe
如果不處理證書(shū),似乎沒(méi)有什么終極解決辦法,
兩種方案:
一,點(diǎn)擊“高級(jí)”,再點(diǎn)擊“繼續(xù)瀏覽……”,下一次再打開(kāi)該網(wǎng)頁(yè)時(shí)谷歌瀏覽器就不會(huì)提示不是私密連接了。
二、看到“你的連接不是私密連接”畫(huà)面時(shí),直接在鍵盤(pán)上敲擊“thisisunsafe”12個(gè)字母,谷歌瀏覽器會(huì)自動(dòng)刷新顯示網(wǎng)頁(yè)。
java鏈接kind 創(chuàng)建的k8s
上面的案例如果看完了,基本我的坑就走完了,你已經(jīng)大致明白了如何通過(guò)kind去如何創(chuàng)建一個(gè)k8s了,我也是摸了好多坑肝出來(lái)了,但是在機(jī)器上面操作并不滿足我們的日常需求,太麻煩了,所以能不能像k8s一樣去鏈接service端進(jìn)行操作。首先說(shuō)結(jié)論,是可行的。連接方式跟我們連接k8s是一樣的,你完全可以按我的demo進(jìn)行操作,不過(guò)我也剛打通,里面的還不是很清楚
整體demo依賴可以建一個(gè)空項(xiàng)目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>k8sDemo</artifactId><version>1.0.0-SNAPSHOT</version><name>springboot-k8s</name><description>k8s 介入</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.google.api-client</groupId><artifactId>google-api-client</artifactId><version>1.32.1</version><exclusions><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency><dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>12.0.1</version></dependency><dependency><groupId>io.fabric8</groupId><artifactId>kubernetes-client</artifactId><version>5.10.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency></dependencies></project>
package com.k8s.demo;import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1Pod;
import io.kubernetes.client.openapi.models.V1PodList;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.util.ResourceUtils;import java.io.FileReader;
import java.io.IOException;@Slf4j
public class KubernetesExample {public static void main(String[] args) {try {// 創(chuàng)建ApiClientString kubeConfigPath = ResourceUtils.getURL("classpath:config").getPath();ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();OkHttpClient httpClient = client.getHttpClient().newBuilder().hostnameVerifier((hostname, session) -> true) // 允許任何主機(jī)名.build();client.setHttpClient(httpClient);Configuration.setDefaultApiClient(client);CoreV1Api api = new CoreV1Api();// invokes the CoreV1Api clientV1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null);System.out.println("Listing all pods: ");for (V1Pod item : list.getItems()) {System.out.println(item.getMetadata().getName());}} catch (IOException e) {log.error("讀取kubeConfigPath異常", e);} catch (Exception e) {log.error("構(gòu)建K8s-Client異常", e);}}
}
關(guān)于這個(gè):classpath:config:在你主機(jī)上輸入
vim ~/.kube/config
把這個(gè)配置文件拿下來(lái),里面有你這個(gè)主機(jī)所有集群的配置,你也可以作為參數(shù)傳入進(jìn)去,這個(gè)就看你自己
如果你看到這個(gè)樣子,已經(jīng)通了。但是這個(gè)連接沒(méi)有證書(shū),后面可能需要處理一下,既然已經(jīng)到這里了,其實(shí)還是要聊一下k8s
可能你在連接的時(shí)候會(huì)出現(xiàn)以下錯(cuò)誤
當(dāng)你連接到 Kubernetes 集群時(shí),可能會(huì)遇到 javax.net.ssl.SSLPeerUnverifiedException
異常,而異常消息是 Hostname not verified 或者類似的錯(cuò)誤信息。
這個(gè)錯(cuò)誤通常是由于連接的主機(jī)名與證書(shū)中的主機(jī)名不匹配引起的。為了確保安全,SSL/TLS 連接需要驗(yàn)證證書(shū)中的主機(jī)名與實(shí)際連接的主機(jī)名是否匹配。上文我已經(jīng)忽略了
還有可能出現(xiàn),Kubernetes control plane is running at https://[::1]:對(duì)應(yīng)端口 這是你用了ipv6 但是又沒(méi)有指定,以為他是支持ipv4 和 ipv6的
你如果對(duì)于ipv4和ipv6不了解沒(méi)關(guān)系下面我會(huì)說(shuō)一下
你還可能會(huì)出現(xiàn) 你的主機(jī)不是 127.0.0.1,而你無(wú)法通過(guò) kubectl 訪問(wèn) kind 創(chuàng)建的本地 Kubernetes 集群這時(shí)候你需要指定,在創(chuàng)建集群的時(shí)候,來(lái)源為kind 的配置文件
kind配置文件網(wǎng)址 對(duì)應(yīng)配置 以下為我摘要的
您可以在 iptables 和 ipvs 之間配置將使用的 kube-proxy 模式。默認(rèn)情況下使用 iptables
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:kubeProxyMode: "ipvs"
所以你可能需要配置一下地址,為0.0.0.0 這樣所有ipv4的都可以訪問(wèn)
關(guān)于IPv4和IPv6
IPv4和IPv6是互聯(lián)網(wǎng)協(xié)議的兩個(gè)版本,它們之間的主要區(qū)別在于地址的格式和長(zhǎng)度。
IPv4使用32位地址,表示為4個(gè)十進(jìn)制數(shù),每個(gè)數(shù)的取值范圍為0-255,例如:192.168.0.100。IPv4地址空間有限,隨著互聯(lián)網(wǎng)的快速發(fā)展,IPv4地址已經(jīng)趨于枯竭。
IPv6使用128位地址,表示為8組16進(jìn)制數(shù),每組之間用冒號(hào)分隔,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6擁有更大的地址空間,可以容納更多的設(shè)備和連接。
在容器服務(wù)中,使用IPv4或IPv6來(lái)訪問(wèn)容器的服務(wù)有以下區(qū)別:
IP地址格式:IPv4使用點(diǎn)分十進(jìn)制表示法,IPv6使用冒號(hào)分隔的16進(jìn)制表示法。
地址空間:IPv4地址空間有限,而IPv6地址空間更加廣闊。
支持設(shè)備數(shù)量:IPv6能夠支持更多的設(shè)備和連接,可以滿足互聯(lián)網(wǎng)發(fā)展的需求。
兼容性:由于IPv4和IPv6是不同的地址格式,不同的網(wǎng)絡(luò)設(shè)備和應(yīng)用程序可能對(duì)IPv6支持程度不同。一些舊的設(shè)備和應(yīng)用程序可能僅支持IPv4。
在選擇使用IPv4還是IPv6來(lái)訪問(wèn)容器服務(wù)時(shí),需要考慮網(wǎng)絡(luò)環(huán)境、設(shè)備支持和應(yīng)用程序需求等因素。同時(shí),還需要確保網(wǎng)絡(luò)配置正確并與容器服務(wù)的網(wǎng)絡(luò)配置相匹配,以確保能夠成功訪問(wèn)容器的服務(wù)。
k8s概念
先說(shuō)一下常用命令
#獲取資源列表:kubectl get pods:獲取所有 Pods 列表。
kubectl get deployments:獲取所有部署列表。
kubectl get services:獲取所有服務(wù)列表。
kubectl get nodes:獲取所有節(jié)點(diǎn)列表。
kubectl get namespaces:獲取所有命名空間列表。#查看資源詳細(xì)信息:
kubectl describe pod <pod名稱>:查看特定 Pod 的詳細(xì)信息。
kubectl describe deployment <deployment名稱>:查看特定部署的詳細(xì)信息。
kubectl describe service <service名稱>:查看特定服務(wù)的詳細(xì)信息。#創(chuàng)建、更新和刪除資源:
kubectl create -f <文件>:根據(jù)指定的 YAML 文件創(chuàng)建資源。
kubectl apply -f <文件>:根據(jù)指定的 YAML 文件創(chuàng)建或更新資源。
kubectl delete <資源類型> <資源名稱>:刪除指定的資源。#執(zhí)行操作:
kubectl exec -it <pod名稱> -- <命令>:在特定 Pod 中執(zhí)行命令。
kubectl logs <pod名稱>:查看特定 Pod 的日志。#其他常用命令:
kubectl config view:查看當(dāng)前的 kubeconfig 配置。
kubectl cluster-info:查看集群的信息。
get常用命令
#以ps輸出格式列出所有Pod
kubectl get pods#以更詳細(xì)的信息(如節(jié)點(diǎn)名稱)的ps輸出格式列出所有Pod
kubectl get pods -o wide#以ps輸出格式列出指定名稱的單個(gè)復(fù)制控制器
#kubectl get replicationcontroller web#以JSON輸出格式列出"apps" API組的"v1"版本中的部署
kubectl get deployments.v1.apps -o json#以JSON輸出格式列出單個(gè)Pod
kubectl get -o json pod web-pod-13je7#以JSON輸出格式列出在"pod.yaml"文件中指定的類型和名稱的Pod
kubectl get -f pod.yaml -o json#使用kustomization.yaml文件從目錄中列出資源 - 示例:dir/kustomization.yaml
kubectl get -k dir/#只返回指定Pod的階段值
kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}#使用自定義列來(lái)列出資源信息
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image#以ps輸出格式同時(shí)列出所有復(fù)制控制器和服務(wù)
kubectl get rc,services#通過(guò)類型和名稱列出一個(gè)或多個(gè)資源
kubectl get rc/web service/frontend pods/web-pod-13je7#列出單個(gè)Pod的"status"子資源
kubectl get pod web-pod-13je7 --subresource status
config常用命令
#顯示當(dāng)前上下文(context)
kubectl config current-context#從kubeconfig中刪除指定的集群。
kubectl config delete-cluster #:從kubeconfig中刪除指定的上下文。
kubectl config delete-context#:從kubeconfig中刪除指定的用戶。
kubectl config delete-user#:顯示在kubeconfig中定義的集群。
kubectl config get-clusters#:描述一個(gè)或多個(gè)上下文。
kubectl config get-contexts#:顯示在kubeconfig中定義的用戶。
kubectl config get-users#:重命名kubeconfig文件中的上下文。
kubectl config rename-context#:在kubeconfig文件中設(shè)置單個(gè)值。
kubectl config set#:在kubeconfig中設(shè)置一個(gè)集群條目。
kubectl config set-cluster#:在kubeconfig中設(shè)置一個(gè)上下文條目。
kubectl config set-context#:在kubeconfig中設(shè)置一個(gè)用戶條目。
kubectl config set-credentials#:在kubeconfig文件中取消設(shè)置單個(gè)值。
kubectl config unset#:在kubeconfig文件中設(shè)置當(dāng)前上下文。
kubectl config use-context#:顯示合并的kubeconfig設(shè)置或指定的kubeconfig文件。
kubectl config view
apply 常用命令
#:將pod.json文件中的配置應(yīng)用到一個(gè)Pod。
kubectl apply -f ./pod.json#:從包含kustomization.yaml的目錄中應(yīng)用資源配置。例如:dir/kustomization.yaml。
kubectl apply -k dir/#:將stdin中的JSON配置應(yīng)用到一個(gè)Pod。
cat pod.json | kubectl apply -f -#:應(yīng)用所有以'.json'結(jié)尾的文件中的配置。
kubectl apply -f '*.json'#:應(yīng)用manifest.yaml文件中匹配標(biāo)簽app=nginx的配置,并刪除所有不在文件中且不匹配標(biāo)簽app=nginx的其他資源(注意:--prune仍處于Alpha階段)。
kubectl apply --prune -f manifest.yaml -l app=nginx#:應(yīng)用manifest.yaml文件中的配置,并刪除除了文件中的ConfigMap之外的所有其他配置(--prune-allowlist指定了要保留的資源類型)。
kubectl apply --prune -f manifest.yaml --all --prune-allowlist=core/v1/ConfigMap#:編輯資源/對(duì)象的最新last-applied-configuration注釋。
kubectl edit-last-applied#:將一個(gè)活動(dòng)對(duì)象上的last-applied-configuration注釋設(shè)置為與文件內(nèi)容匹配。
kubectl set-last-applied#:查看資源/對(duì)象的最新last-applied-configuration注釋
kubectl view-last-applied。