2.2 配置Kubernetes集群
2.2 配置Kubernetes集群
现在,应用被打包在一个容器镜像中,并通过Docker Hub给大家使用,可以将它部署到Kubernetes集群中,而不是直接在Docker中运行。但是需要先设置集群。
2.2.1 用Minikube运行一个本地单节点Kubernetes集群
使用Minikube是运行Kubernetes集群最简单、最快捷的途径。Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用。
虽然我们不能展示与管理多节点应用相关的一些Kubernetes特性,但是单节点集群足以探索本书中讨论的大多数主题。
一键安装Minikube
https://minikube.sigs.k8s.io/docs/start/
推荐阿里团队编译的版本
https://github.com/AliyunContainerService/minikube/wiki
docker 权限问题
https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user
安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
启动 dashboard:
minikube dashboard
为 dashboard 添加外部访问代理,此处的 IP 为本地系统 IP:
kubectl proxy --port=8001 --address='10.0.0.2' --accept-hosts='^.*' &
通过 url: http://192.168.0.43:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ 访问 dashboard。
使用kubectl查看集群是否正常工作
要验证集群是否正常工作,可以使用以下所示的 kubectl cluster-info命令。
代码清单2.11 展示集群信息
s kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/...
kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/.....
这里显示集群已经启动。它显示了各种Kubernetes组件的URL,包括API服务器和Web控制台。
提示 可以运行 minikube ssh 登录到Minikube VM并从内部探索它。例如,可以查看在节点上运行的进程。
通过列出集群节点查看集群是否在运行
现在可以使用kubectl命令列出集群中的所有节点,如下面的代码清单所示。
代码清单2.13 使用kubectl列出集群节点
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 10h v1.20.2
k8s-node1 NotReady <none> 9h v1.20.2
k8s-node2 NotReady <none> 9h v1.20.2
kubectl get 命令可以列出各种Kubernetes对象。你将会经常使用到它,但它通常只会显示对象最基本的信息。
查看对象的更多信息
要查看关于对象的更详细的信息,可以使用 kubectl describe 命令,它显示了更多信息:
# kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 36d v1.20.2
# kubectl describe node
Name: minikube
Roles: control-plane,master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=minikube
kubernetes.io/os=linux
minikube.k8s.io/commit=c61663e942ec43b20e8e70839dcca52e44cd85ae
minikube.k8s.io/name=minikube
minikube.k8s.io/updated_at=2021_05_29T04_31_54_0700
minikube.k8s.io/version=v1.20.0
node-role.kubernetes.io/control-plane=
node-role.kubernetes.io/master=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Sat, 29 May 2021 04:31:13 -0400
Taints: <none>
Unschedulable: false
Lease:
HolderIdentity: minikube
AcquireTime: <unset>
RenewTime: Sun, 04 Jul 2021 05:37:02 -0400
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure False Sun, 04 Jul 2021 05:33:19 -0400 Sat, 29 May 2021 04:31:10 -0400 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Sun, 04 Jul 2021 05:33:19 -0400 Sat, 29 May 2021 04:31:10 -0400 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Sun, 04 Jul 2021 05:33:19 -0400 Sat, 29 May 2021 04:31:10 -0400 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Sun, 04 Jul 2021 05:33:19 -0400 Sat, 29 May 2021 04:31:24 -0400 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 172.17.0.2
Hostname: minikube
Capacity:
cpu: 4
ephemeral-storage: 36714992Ki
hugepages-2Mi: 0
memory: 3825960Ki
pods: 110
Allocatable:
cpu: 4
ephemeral-storage: 36714992Ki
hugepages-2Mi: 0
memory: 3825960Ki
pods: 110
System Info:
Machine ID: 822f5ed6656e44929f6c2cc5d6881453
System UUID: e2e7a85c-9a7a-43c3-a477-1de0508882b9
Boot ID: b2e471d6-cf68-47e9-813e-d21d7d97d002
Kernel Version: 4.18.0-305.7.1.el8_4.x86_64
OS Image: Ubuntu 20.04.2 LTS
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://20.10.6
Kubelet Version: v1.20.2
Kube-Proxy Version: v1.20.2
PodCIDR: 10.244.0.0/24
PodCIDRs: 10.244.0.0/24
Non-terminated Pods: (15 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default balanced-5744b548b4-sdhbr 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
default frontend-gcxkr 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
default frontend-tpc2d 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
default frontend-z54q5 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
default hello-minikube-6ddfcc9757-v76vx 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
default kubia-deployment-779b677d96-4rn64 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
kube-system coredns-74ff55c5b-bbkgx 100m (2%) 0 (0%) 70Mi (1%) 170Mi (4%) 36d
kube-system etcd-minikube 100m (2%) 0 (0%) 100Mi (2%) 0 (0%) 10m
kube-system kube-apiserver-minikube 250m (6%) 0 (0%) 0 (0%) 0 (0%) 10m
kube-system kube-controller-manager-minikube 200m (5%) 0 (0%) 0 (0%) 0 (0%) 36d
kube-system kube-proxy-cptsg 0 (0%) 0 (0%) 0 (0%) 0 (0%) 36d
kube-system kube-scheduler-minikube 100m (2%) 0 (0%) 0 (0%) 0 (0%) 36d
kube-system storage-provisioner 0 (0%) 0 (0%) 0 (0%) 0 (0%) 36d
kubernetes-dashboard dashboard-metrics-scraper-f6647bd8c-mq6f7 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
kubernetes-dashboard kubernetes-dashboard-968bcb79-8sr4b 0 (0%) 0 (0%) 0 (0%) 0 (0%) 35d
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 750m (18%) 0 (0%)
memory 170Mi (4%) 170Mi (4%)
ephemeral-storage 100Mi (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Starting 10m kubelet Starting kubelet.
Normal NodeAllocatableEnforced 10m kubelet Updated Node Allocatable limit across pods
Normal NodeHasSufficientMemory 10m (x7 over 10m) kubelet Node minikube status is now: NodeHasSufficientMemory
Normal NodeHasNoDiskPressure 10m (x8 over 10m) kubelet Node minikube status is now: NodeHasNoDiskPressure
Normal NodeHasSufficientPID 10m (x8 over 10m) kubelet Node minikube status is now: NodeHasSufficientPID
Warning readOnlySysFS 9m29s kube-proxy CRI error: /sys is read-only: cannot modify conntrack limits, problems may arise later (If running Docker, see docker issue #24000)
Normal Starting 9m29s kube-proxy Starting kube-proxy.
这里省略了 describe 命令的实际输出,因为内容非常多且在书中是完全不可读的。输出显示了节点的状态、CPU和内存数据、系统信息、运行容器的节点等。
在前面的 kubectl describe 示例中,显式地指定了节点的名称,但也可以执行一个简单的 kubectl describe node
命令,而无须指定节点名,它将打印出所有节点的描述信息。
提示 当只有一个给定类型的对象存在时,不指定对象名就运行 description和 get 命令是很提倡的,这样不会浪费时间输入或复制、粘贴对象的名称。
当我们讨论减少输入的时候,开始在Kubernetes运行第一个应用程序之前,先学习如何让 kubectl 命令的使用变得更容易。
2.2.3 为kubectl配置别名和命令行补齐
kubectl 会被经常使用。很快你就会发现每次不得不打全命令是非常痛苦的。在继续之前,花一分钟为kubectl 设置别名和tab命令补全可让使用变得简单。
创建别名
在整本书中,一直会使用 kubectl
可执行文件的全名,但是你可以添加一个较短的别名,如 k,这样就不用每次都输入 kubectl
了。如果还没有设置别名,这里会告诉你如何定义。将下面的代码添加到 ~/.bashrc
或类似的文件中:
alias k=kubectl
#使配置生效
$source ~/.bashrc
为kuebctl配置tab补全
即使使用短别名k,仍然需要输入许多内容。幸运的是,kubectl命令还可以配置bash和zsh shell的代码补全。tab补全不仅可以补全命令名,还能补全对象名。例如,无须在前面的示例中输入整个节点名,只需输入
$ kubectl desc<TAB> no<TAB> gke-ku<TAB>
需要先安装一个叫作 bashcompletion 的包来启用bash中的tab命令补全,然后可以运行接下来的命令(也需要加到 ~/.bashrc
或类似的文件中):
$ source <(kubectl completion bash)
但是需要注意的是,tab命令行补全只在使用完整的 kubectl 命令时会起作用(当使用别名 k
时不会起作用)。需要改变 kubectl completion
的输出来修复:
$ source <(kubectl completion bash | sed s/kubectl/k/g)