代码改变世界

k8s安装

2024-01-17 13:41  youxin  阅读(169)  评论(0编辑  收藏  举报

kubectl安装:

https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/

启动 kubectl 自动补全功能

Bash

你现在需要确保一点:kubectl 补全脚本已经导入(sourced)到 Shell 会话中。 可以通过以下两种方法进行设置:

echo 'source <(kubectl completion bash)' >>~/.bashrc

如果 kubectl 有关联的别名,你可以扩展 Shell 补全来适配此别名:

echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
说明:

bash-completion 负责导入 /etc/bash_completion.d 目录中的所有补全脚本。

两种方式的效果相同。重新加载 Shell 后,kubectl 自动补全功能即可生效。 若要在当前 Shell 会话中启用 Bash 补全功能,源引 ~/.bashrc 文件:

source ~/.bashrc


k8s解决kubectl -bash: _get_comp_words_by_ref: 未找到命令

1. yum -y install bash-completion
2. source /usr/share/bash-completion/bash_completion
3. echo 'source <(kubectl completion bash)' >> ~/.bashrc

 


kind安装

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /$PATH/kind

 用go install命令安装:

Installing with go install

When installing with Go please use the latest stable Go release. At least go1.16 or greater is required.

To install use: go install sigs.k8s.io/kind@v0.20.0.

If you are building from a local source clone, use go install . from the top-level directory of the clone.

go install will typically put the kind binary inside the bin directory under go env GOPATH, see Go’s “Compile and install packages and dependencies” for more on this. You may need to add that directory to your $PATH if you encounter the error kind: command not found after installation, you can find a guide for adding a directory to your PATH at https://gist.github.com/nex3/c395b2f8fd4b02068be37c961301caa7#file-path-md.

 

kind
kind creates and manages local Kubernetes clusters using Docker container 'nodes'

Usage:
  kind [command]

Available Commands:
  build       Build one of [node-image]
  completion  Output shell completion code for the specified shell (bash, zsh or fish)
  create      Creates one of [cluster]
  delete      Deletes one of [cluster]
  export      Exports one of [kubeconfig, logs]
  get         Gets one of [clusters, nodes, kubeconfig]
  help        Help about any command
  load        Loads images into nodes
  version     Prints the kind CLI version

Flags:
  -h, --help              help for kind
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity, higher value produces more output
      --version           version for kind

Use "kind [command] --help" for more information about a command.

简单说下几个比较常用选项的含义:

 

build:用来从 Kubernetes 源代码构建一个新的镜像。

create:创建一个 Kubernetes 集群。

delete:删除一个 Kubernetes 集群。

get: 可用来查看当前集群、节点信息以及 Kubectl 配置文件的地址。

load:从宿主机向 Kubernetes 节点内导入镜像。

 

 

kind create cluster --name mykind1

Command Output: WARNING: Your kernel does not support cgroup namespaces. Cgroup namespace setting discarded.
9e339988d087173127bc4f291b34c6269e4b485cfdfb892789b38db8f0b3e664
docker: Error response from daemon: failed to create shim: OCI runtime create failed: cgroup namespaces aren't enabled in the kernel: unknown.

 原因:https://github.com/kubernetes-sigs/kind/issues/3311

So unfortunately RHEL 7 is stuck on kernel 3.10, which means that the cgroupns=private feature cannot be used, even though we have a recent enough verison of docker to support it.

Even trying to create any container with that feature fails:

$ docker run -ti --rm --cgroupns=private alpine
WARNING: Your kernel does not support cgroup namespaces.  Cgroup namespace setting discarded.
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: cgroup namespaces aren't enabled in the kernel: unknown.
 

On RHEL8, it uses kernel 4.18, which is sufficient for this feature, and that will also use cgroups v2.

While I understand the project want to use this feature, with good reason, would it be possible to have a flag to disable its use, for use on older environments?

解决办法:降级kind  go install sigs.k8s.io/kind@v0.19.0 

 

K8s 创建好之后,我们可以用下列命令查看 K8s 集群

#查看集群
kubectl cluster-info --context kind-tsk8s
#查看node
kubectl get nodes
#查看kube-system空间内运行的pod
kubectl get pods -n kube-system

kubectl get node
NAME STATUS ROLES AGE VERSION
mykind1-control-plane Ready control-plane 4m46s v1.27.1

 

运行结果

图 11

说明:

可以看到现在只有一个 node。上一篇文章中介绍的 control-plance 和工作 node 都在这个 node 上。

图 12

说明:

从这个图片可以看到,上一篇文章中提到到 apiserver,dns,scheduler 等组件均是以 pod 的形式(容器)在运行。

这里 K8s 作为管理容器的服务,本身也是运行容器来实现其功能。

我们用 docker 命令再观察一下现在运行的容器

docker ps

图 13

 

在 Docker Desktop 中查看容器

图 14

分析:

这里我们看到只有一个运行的容器“tsk8s-control-plane”,但是我们用“kubectl get pods”查看 pod 时,发现有许多 pod 在运行。

这是怎么回事?

原因在于 kind 创建 K8s 时,实际上是利用镜像启了一个容器而 K8s 的整个服务都运行在这个容器内部。

我们进入这个容器的内部进行观察,运行命令

#进入容器内部
docker exec -it tsk8s-control-plane bash
#查看运行的容器
crictl ps



crictl 是Kubelet容器接口(CRI)的CLI和验证工具。。 你可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 crictl 和它的源代码在 cri-tools 代码库

图 15

说明:

在“tsk8s-control-plane”容器内部,我们看到了 K8s 集群正在运行的容器

在这里我们用的是“crictl ps”来查看容器,因为在“tsk8s-control-plane”容器中的容器运行环境(runtime)不是 Docker 而是 Containerd。

Containerd 使用的命令与 docker 相似,把 docker 命令中 docker 换成 crictl 即可。

提示:未来 K8s 新版本将不再支持 docker 做为运行环境

对于 kind 创建的 K8s 集群,我们可以简单理解上面用 docker ps 看到的“tsk8s-control-plane”容器就是一台服务器,而我们把 K8s 服务(Control plane + 工作 node)都搭在了这台服务器上。

我们的 WSL 就相当于一个装有 kubectl 命令行的客户端,我们用这个客户端连接 K8s 集群并操作。

5. 使用 Dashboard

我们除了可以用 kubectl 命令行来控制 K8s 外,我们还可以利用 Dashboard 图形界面来进行一些操作。

我们可以利用 Dashboard 监控 K8s,部署应用,创建及修改各种资源。

Dashboard 非默认安装,所以我们需要手工部署。

 

https://github.com/kubernetes/dashboard?tab=readme-ov-file

kubectl apply  -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

 
 
cert-manager 

3.0需要依赖cert-manager,我们先要这个这个

Kubeflow 组件使用 cert-manager 来为准入 Webhooks 提供证书。
Install cert-manager:

kustomize build common/cert-manager/cert-manager/base | kubectl apply -f -
kubectl wait --for=condition=ready pod -l 'app in (cert-manager,webhook)' --timeout=180s -n cert-manager
kustomize build common/cert-manager/kubeflow-issuer/base | kubectl apply -f -

如果出现如下错误:

Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook "webhook.cert-manager.io": failed to call webhook: Post "https://cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s": dial tcp 10.96.202.64:443: connect: connection refused

这是因为 webhook 尚未准备好接收请求。等待几秒钟,然后重试应用清单

然后就安装成功了

Kubernetes dashboardv2.7.0安装指南:从零开始搭建可视化界面

https://zhuanlan.zhihu.com/p/655525723

命令行代理

你可以使用 kubectl 命令行工具来启用 Dashboard 访问,命令如下:

kubectl proxy

kubectl 会使得 Dashboard 可以通过 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问。

UI 只能 通过执行这条命令的机器进行访问。更多选项参见 kubectl proxy --help

说明:

Kubeconfig 身份验证方法不支持外部身份提供程序或基于 x509 证书的身份验证。

 

如果不是localhost访问需要执行:kubectl proxy --address=0.0.0.0

 

   grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt

 grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key

 openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

导入p12证书。

 

k8s api访问证书

 

$ cp /etc/kubernetes/admin.conf $HOME/.kube/config
$ grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
$ grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
$ openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

 

证书导入后还是访问不了,看了一篇文章:

方法一: kubectl port-forward

注意: 这种方法适合有正式ssl证书的情况. 如果没有, 先用方法二进行访问.

In an environment where one needs to access the dashboard from another host than the kubectl proxy's localhost, one can run: kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0 to access the dashboard through HTTPS

然后访问: https://ttg12:10443.

不过因为测试环境没有正式的ssl证书, 所以浏览器会拒绝访问. 需要采用方法二.