0%

Kubernetes入门 -- 二优化与进阶

上一篇文章介绍了通过kubeadm来配置Kubernetes集群运行环境。那在开始运行我们的项目之前,还是来了解一些能够提高我们执行效率的技巧吧!

kubectl命令自动补全

kubectl completion

在 Master 节点上,执行 kubectl 命令时,默认是无法使用自动提示的功能。也就导致了我们需要把命令敲完整才可以。kubectl 工具本身就支持自动补全,只不过需要设置一下。

如果你使用的是 bash, 则执行如下命令:

1
2
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc

如果你使用的是 zsh,则执行如下命令:

1
2
$ echo "source <(kubectl completion zsh)" >> ~/.zshrc
$ source ~/.zshrc

或者直接编辑 ~/.zshrc 加上 source <(kubectl completion zsh) 一行。

Kube-prompt:交互式 Kubernetes 客户端

Kube-prompt 可以让你在命令行下接受与 Kubectl 相同的命令,并且不需要提供 Kubectl 前缀。Kube-prompt 还提了交互式会话下的命令提示、自动补全等功能。

项目地址:c-bata/kube-prompt: An interactive kubernetes client featuring auto-complete.

安装:

直接访问地址 Releases · c-bata/kube-prompt 下载相应文件并解压到本地。然后给 kube-prompt 加上执行权限并移懂到系统目录:

1
2
$ chmod +x kube-prompt
$ sudo mv ./kube-prompt /usr/local/bin/kube-prompt

重置 kubernetes init

如果需要在 kubeadm init 中加入一些其他的参数配置,那么如何重置刚才的操作呢?

执行 kubeadm reset 命令即可,该命令会将主机恢复原状:

1
2
3
[root@master ~]# kubeadm reset
[reset] WARNING: changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] are you sure you want to proceed? [y/N]:

如何从集群中移除Node节点

如果需要从集群中移除 node1 这个Node执行下面的命令:

在master节点上执行:

1
2
# kubectl drain <node1> --delete-local-data --force --ignore-daemonsets
# kubectl delete node <node1>

node1 上执行以下几条命令:

1
2
3
4
5
6
# kubeadm reset
# ifconfig cni0 down
# ip link delete cni0
# ifconfig flannel.1 down
# ip link delete flannel.1
# rm -rf /var/lib/cni/

新增Node节点但token过期了

默认情况下,Kubernetes生成的token过期时间是24小时。可以通过 kubeadm token list 命令来查看:

1
2
3
➜  ~ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
runell.pdp1y28g1dsayy1o 20h 2019-05-18T08:03:41+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token

在 token 过期之后,如果想要增加新的节点,可以通过如下命令生成新的 token 值:

1
kubeadm token create

查看密钥的 hash 值:

1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //'

在要新增的节点上执行:

1
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

在其他电脑上使用kubectl远程管理

在管理Kubernetes集群时,我们每次执行kubectl命令都要登录到 Master 节点上操作,有一些麻烦。我们可以直接在自己的开发电脑上通过安装单独的 kubectl 文件来进行远程管理。

安装kubectl

以MacOS为例。

二进制方式安装

执行如下命令安装最新版本的kubectl:

1
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

要下载特定版本,可通过以下命令查询可用版本:

1
curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt

然后通过下面的命令下载,以 v1.14.0 版本为例:

1
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.0/bin/darwin/amd64/kubectl

然后,为其赋予可执行权限并放到系统目录下:

1
2
3
chmod +x ./kubectl

sudo mv ./kubectl /usr/local/bin/kubectl

验证是否可用:

1
kubectl version

不过由于“网络原因”,地址 https://storage.googleapis.com 可能访问不到。也就导致上面的下载命令会一直卡着不动。

我们只能通过去指定的二进制文件下载地址了。


找到 Kubernetes在 GitHub上的仓库地址其中的 CHANGELOG.md 文件:kubernetes/CHANGELOG.md at master · kubernetes/kubernetes

选择指定版本下的 Client Binaries

选择指定的文件下载:

下载到本地:

1
➜ wget https://dl.k8s.io/v1.14.1/kubernetes-client-darwin-amd64.tar.gz

注:https://dl.k8s.io 这个网址可能也访问不到,建议还是使用 FQ 工具后操作。

安装好后进行验证:

1
2
3
➜ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:11:31Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"darwin/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

正常显示版本信息。

通过homebrew安装

如果觉得上面的方式太繁琐,还可以选择使用 Homebrew 来安装:

1
2
3
brew install kubernetes-cli

kubectl version
其他系统

其他系统可用的 kubectl 除了上面的二进制方式,还可以在这个地址中下载(无需FQ):


获取授权文件

要连接到Kubernetes集群,还需要指定授权文件。只需将 Master 节点上的授权文件拷贝到本地的默认路径 $HOME/.kube 中。

创建 $HOME/.kube 目录:

1
➜ mkdir -p $HOME/.kube

执行 scp 命令:

1
➜ scp root@192.168.5.28:/etc/kubernetes/admin.conf ~/.kube/config

验证能否正常连接到集群:

1
2
3
4
➜ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 5h52m v1.14.1
node1 Ready <none> 4h48m v1.14.1

因为 kubectl默认的配置文件路径是 $HOME/.kube/config ,所以我们直接设置成这个。如果是其他路径,则需要通过 --kubeconfig 参数指定配置文件:

1
kubectl --kubeconfig ./admin.conf get nodes
启用自动补全

这里,依然需要设置一下 kubectl 命令的自动补全(zsh):

1
2
$ echo "source <(kubectl completion zsh)" >> ~/.zshrc
$ source ~/.zshrc

常用命令

查看集群信息

命令:kubectl cluster-info

1
2
3
4
5
➜  ~ kubectl cluster-info
Kubernetes master is running at https://192.168.5.28:6443
KubeDNS is running at https://192.168.5.28:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
查看版本信息

命令:kubectl version

1
2
3
➜  ~ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:11:31Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:02:58Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

查看集群所有Pod信息: kubectl get pod --all-namespaces

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ~ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-fb8b8dccf-cm28l 1/1 Running 1 3h48m
kube-system coredns-fb8b8dccf-lqh8n 1/1 Running 1 3h48m
kube-system etcd-master 1/1 Running 1 3h47m
kube-system kube-apiserver-master 1/1 Running 1 3h47m
kube-system kube-controller-manager-master 1/1 Running 1 3h47m
kube-system kube-flannel-ds-amd64-2rzqc 1/1 Running 1 3h16m
kube-system kube-flannel-ds-amd64-thg6z 1/1 Running 1 165m
kube-system kube-proxy-8x8f6 1/1 Running 1 108m
kube-system kube-proxy-k54d5 1/1 Running 1 108m
kube-system kube-scheduler-master 1/1 Running 1 3h48m
➜ ~

未完待续。。。

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc