管理集群
安装网络插件
如果要让pod可以相互通信,必须安装网络插件
网络必须在所有应用程序之前部署。并且,在安装网络之前CoreDNS不会启动。kubeadm仅支持基于容器网络接口(CNI)的网络(不支持kubenet)。
一些项目使用CNI提供Kubernetes Pod网络,其中一些还支持网络策略(Network Policy)。
例:使用Calico作为网络插件
Calico默认使用 192.168.0.0/16
作为CIDR(Classless Inter-Domain Routing,无类域间路由选择),需要在执行 kubeadm init
命令时配置Calico的CIDR:
kubeadm init --apiserver-advertise-address master的IP --pod-network-cidr 192.168.0.0/16
然后应用网络插件(插件中的CIDR必须与上面配置的一致)
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
安装完之后,可以看看下面命令的输出中的CoreDNS Pod是否正在运行来确认其是否正常工作
kubectl get pods --all-namespaces
使用k8s API访问集群
要访问集群,需要知道集群位置并拥有凭证,使用下面的命令检查kubectl已知的位置和凭证
kubectl config view
直接访问REST API
kubectl 处理对 API 服务器的定位和身份验证。如果想通过 http 客户端(如 curl
或 wget
,或浏览器)直接访问 REST API,可以通过多种方式对 API 服务器进行定位和身份验证:
- 以代理模式运行 kubectl(推荐)。 使用存储的 apiserver 位置并使用自签名证书验证 API 服务器的标识。可以防止中间人(MITM)攻击。
- 另外,也可以直接为 http 客户端提供位置和身份认证。这适用于被代理混淆的客户端代码。为防止中间人攻击,您需要将根证书导入浏览器。
使用kubectl代理
运行kubectl的反向代理来处理API请求
kubectl proxy --port=8080 &
然后就可以通过 curl,wget,或浏览器访问 API:
curl http://localhost:8080/api/
输出类似如下:
{
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
不使用 kubectl 代理
将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理:
使用 grep/cut
方式:
# 检查所有可用的集群,因为 .KUBECONFIG 可能有多个上下文:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# 从上面的输出中选择你要进行交互的集群名:
export CLUSTER_NAME="some_server_name"
# 选择指定集群的API服务器
APISERVER=$(kubectl config view -o jsonpath="{
.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
# 获取令牌的值
TOKEN=$(kubectl get secrets -o jsonpath="{
.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)
# 持令牌访问API
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
输出类似如下:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
使用 jsonpath
方式:
$ APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
$ TOKEN=$(kubectl get secret $(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
使用 --insecure
标志位会导致易受到 MITM 攻击。当 kubectl 访问集群时,会使用存储的根证书和客户端证书访问服务器(已安装在 ~/.kube
目录下)。由于集群认证通常是自签名的,因此可能需要特殊设置才能使 http 客户端使用根证书。
在一些集群中,API 服务器不需要身份认证;它运行在本地,或由防火墙保护着。配置对 API 的访问 里会说集群管理员如何对此进行配置。这种方法可能与未来的高可用性支持发生冲突。
编程方式访问 API
Kubernetes 官方支持 Go 和 Python 的客户端库.
例:python客户端
安装:pip install kubernetes
(详见 Python 客户端库主页 )。
Python 客户端可以使用与 kubectl 命令行工具相同的 kubeconfig 文件 进行验证:
from kubernetes import client, config
config.load_kube_config()
v1=client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items