k8s学习笔记六之连接集群的方式

链接集群

通过 Kubernetes 部署和管理应用,你需要使用 Kubernetes命令行工具, kubectl. 它可以让您检查集群资源,创建、删除和更新组件以及更多功能。您会用它来查看新集群并生成示例应用程序。

安装和设置

  1. 安装kubectl(省略)
  2. 配置kubectl 为了让 kubectl 能够找到并能够访问 Kubernetes 群集,它需要一个kubeconfig 文件,使用kube-up.sh创建群集的时候会自动创建它。 (有关创建集群请看 用户指南)。 如果你需要访问一个不是你创建的群集,请看 访问共享集群文档。 默认情况下,kubectl 配置文件会在~/.kube/config。

通过获取群集状态来检测 kubectl 是否正确配置:

1
$ kubectl cluster-info

如果看到了一个网址,那么 OK 了。

访问集群

  • 访问集群api
    • 第一次使用kubectl访问
    • 直接访问rest api
      • 使用kubectl proxy 访问
      • 不使用kubectl proxy 访问
    • 通过编程方式访问api
    • 从一个pod访问api
  • 通过运行在集群上的服务访问
    • 链接方式
      • 发现内置服务
        • 手动构建apiserver代理URL
          • 示例
        • 使用web浏览器访问集群上的运行的服务
  • 请求重定向
  • 多种代理

访问集群API

  1. 第一次使用kubectl访问 使用 kubectl 命令来查看地址和凭证信息:
1
$ kubectl config view
  1. 直接访问rest api Kubectl处理对apiserver的定位和身份验证。 如果您想使用诸如curl或wget之类的http客户端或浏览器直接访问REST API,可以通过以下几种方式来定位和认证: 在代理模式下运行kubectl。 推荐方法。 使用存储的apiserver位置。 使用自签名证书验证apiserver的身份。 不可能有MITM。 向apiserver进行身份验证。 将来可能会进行智能的客户端负载平衡和故障转移。 直接将位置和凭据提供给http客户端。 替代方法。 与某些使用代理混淆的客户端代码一起使用。 需要将根证书导入浏览器以防止MITM
  2. 使用kubectl proxy
1
kubectl proxy --port=8080 &

使用curl浏览api

1
2
3
4
5
6
$ curl http://localhost:8080/api/
{
  "versions": [
    "v1"
  ]
}
  1. 不适用kubectl proxy
1
2
3
4
5
6
7
8
$ APISERVER=$(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")
$ TOKEN=$(kubectl config view | grep token | cut -f 2 -d ":" | tr -d " ")
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
  "versions": [
    "v1"
  ]
}

MITM攻击。 当kubectl访问群集时,它将使用存储的根证书和客户端证书来访问服务器。 (它们安装在〜/ .kube目录中)。 由于群集证书通常是自签名的,因此可能需要特殊配置才能使http客户端使用根证书。 在某些群集上,apiserver不需要身份验证。 它可能在localhost上服务,或受到防火墙保护。 这没有标准。 配置对API的访问权限描述了集群管理员如何配置它。 此类方法可能与将来的高可用性支持相冲突

  1. 编程的方式访问api 有用于从几种语言访问API的客户端库。 Kubernetes项目支持的Go客户端库可以使用与kubectl CLI相同的kubeconfig文件来定位和验证apiserver
  2. 从pod访问api(略)

通过运行在集群上的服务访问

  1. 链接方式
  • 通过公共IP访问服务
    • 使用类型为NodePort或LoadBalancer的服务使该服务在群集外部可访问。
    • 根据您的群集环境,这可能仅将服务公开给您的公司网络,或者可能将其公开给Internet。 考虑所公开的服务是否安全。 它是否进行自己的身份验证?
    • 将pods放在services后面。 要从一组副本中访问一个特定的Pod(例如用于调试),请在其Pod上放置一个唯一的标签,并创建一个选择此标签的新服务。
    • 在大多数情况下,应用程序开发人员不必通过节点的nodeIP直接访问节点。
  • 使用代理Verb访问services,nodes或者pods
    • 在访问远程服务之前是否进行apiserver身份验证和授权。 如果服务的安全性不足以暴露给Internet,访问节点IP上的端口或进行调试,则使用此方法。
    • 代理可能会导致某些Web应用程序出现问题。
    • 仅适用于HTTP / HTTPS。
  • 从集群中的node或pod进行访问
    • 运行一个pod,然后使用kubectl exec连接到其中的shell。 从该shell连接到其他节点,pod和服务。
    • 某些群集可能允许您SSH到群集中的节点。 从那里您可能能够访问群集服务。 这是一种非标准的方法,将在某些群集上有效,但在其他群集上无效。 浏览器和其他工具可能会也可能不会安装。 群集DNS可能无法正常工作
  1. 发现内置服务 通常,有几种服务是通过kube系统在群集上启动的。使用kubectl cluster-info命令获取这些列表:
1
kubectl cluster-info
  1. 手动构建apiserver代理URL 可以使用 kubectl cluster-info命令找回service proxy url. 创建proxy urls包含了服务endpoints,suffixes和parameters
1
http://kubernetes_master_address/api/v1/proxy/namespaces/namespace_name/services/service_name[:port_name]
  1. 示例 访问Elasticsearch service endpoint _search?q=user:kimchy 应该使用
1
http://104.197.5.247/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy

访问Elasticsearch集群health信息_cluster/health?pretty=true应该使用:

1
https://104.197.5.247/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging/_cluster/health?pretty=true
  1. 使用web浏览器访问集群上的运行的服务 您可能可以将apiserver代理URL放入浏览器的地址栏中。 但是:Web浏览器通常不能传递令牌,因此您可能需要使用基本(密码)身份验证。 可以将Apiserver配置为接受基本身份验证,但是您的群集可能没有配置为接受基本身份验证。 某些Web应用程序可能无法正常运行,尤其是那些使用客户端javascript而不知道代理路径前缀的方式构造网址的Web应用程序

请求重定向

重定向功能已被弃用和删除。 请改为使用代理(请参见下文)。

多重代理

一下可能会遇到同步几种代理:

  1. kubectl代理:
  • 在用户的桌面或pod中运行
  • 从本地主机地址到Kubernetes apiserver的代理
  • 客户端到代理使用HTTP
  • 代理到apiserver使用HTTPS
  • 定位apiserver
  • 添加身份验证标头
  1. apiserver代理:
  • 是apiserver的内置堡垒
  • 将群集外部的用户连接到群集IP,否则将无法访问
  • 在apiserver进程中运行
  • 客户端代理使用HTTPS(如果apiserver如此配置,则为http)
  • 目标代理可以使用代理使用可用信息选择的HTTP或HTTPS
  • 可以用于访问节点,Pod或服务
  • 在用于访问服务时进行负载平衡
  1. kube代理:
  • 在每个节点上运行
  • 代理UDP和TCP
  • 不理解HTTP
  • 提供负载平衡
  • 仅用于访问服务
  1. apiserver前面的代理/负载均衡器:
  • 存在和实现因群集而异(例如nginx)
  • 位于所有客户端和一个或多个apiserver之间
  • 如果有多个apiserver,则充当负载均衡器
  1. 基于外部服务的Cloud Load Balancer
  • 由某些云提供商提供(例如AWS ELB,Google Cloud Load Balancer)
  • 当Kubernetes服务的类型为LoadBalancer时自动创建-仅使用UDP / TCP-实现因云提供商而异。

通过kubeconifg接入集群

可以复制kubectl客户端配置文件 (kubeconfig) 可以访问正在运行的 Kubernetes 群集。 通过 cluster/kube-up.sh 产生的,配置文件在 $HOME/.kube/config 中,生成并使用kubeconfig的详细步骤如下:

1. 创建一个群集

2. 复制 kubeconfig 到新主机

1
$ scp $HOME/.kube/config user@remotehost:/path/to/.kube/config

3. 在新主机中,让kubectl可以使用config副本

  • 选项 A:复制到默认位置
1
$ mv /path/to/.kube/config $HOME/.kube/config
  • 选项 B:复制到工作目录(kubectl 使用的)
1
$ mv /path/to/.kube/config $PWD
  • 选项 C:手动指定 kubectlkubeconfig 所在位置
1
2
3
4
5
# 通过环境变量
$ export KUBECONFIG=/path/to/.kube/config

# 通过命令行参数
$ kubectl ... --kubeconfig=/path/to/.kube/config

手动生成 kubeconfig

kubeconfig 是由 kube-up 生成的,你也可以用下面的命令自己生成它(任何指令集):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 kubeconfig 入口
$ kubectl config set-cluster $CLUSTER_NICK \
    --server=https://1.1.1.1 \
    --certificate-authority=/path/to/apiserver/ca_file \
    --embed-certs=true \
    # 如果不需要 TLS ,则用下面两行替换 --certificate-authority 和 --embed-certs
    --insecure-skip-tls-verify=true \
    --kubeconfig=/path/to/standalone/.kube/config

# 创建用户入口
$ kubectl config set-credentials $USER_NICK \
    # 加载在主机生成的 token。
    --token=$token \
    # 使用 username|password 或者 token,任意一种方式
    --username=$username \
    --password=$password \
    --client-certificate=/path/to/crt_file \
    --client-key=/path/to/key_file \
    --embed-certs=true \
    --kubeconfig=/path/to/standalone/.kube/config

# 创建 context 入口
$ kubectl config set-context $CONTEXT_NAME \
    --cluster=$CLUSTER_NICK \
    --user=$USER_NICK \
    --kubeconfig=/path/to/standalone/.kube/config

笔记:

  • --embed-certs 是指需要产生一个独立的 kubeconfig,将在另一台主机上运行。
  • --kubeconfig 既加载配置参数,也加载保存的配置文件。如果第一次运行,上面的--kubeconfig文件可能会被忽略
1
$ export KUBECONFIG=/path/to/standalone/.kube/config
  • 这个 ca_file, key_file, 和上面提到 KUBE 群集主机产生的 cert_file。 他们可以在/srv/kubernetes文件夹下。 承载的 token/basic 身份认证 也由 kube 主机上产生。 查看 kubeconfig-file.md 来了解更多 kubeconfig 细节 , 或者运行 kubectl config -h.

合并 kubeconfig 的例子

kubectl 加载并合并配置文件(按顺序)

  1. --kubeconfig=/path/to/.kube/config 命令行标识
  2. KUBECONFIG=/path/to/.kube/config 环境变量
  3. $PWD/.kube/config
  4. $HOME/.kube/config

如果在 host1 创建群集 A,B, 在 host2 上创建群集 C,D,你可以在两台主机上运行所有四组群集。

1
2
3
4
5
6
7
8
9
# 在 host2,复制 host1 的默认 kubeconfig,并且配置到环境变量
$ scp host1:/path/to/home1/.kube/config /path/to/other/.kube/config

$ export $KUBECONFIG=/path/to/other/.kube/config

# 在 host1,复制 host2 的默认 kubeconfig,并且配置到环境变量
$ scp host2:/path/to/home2/.kube/config /path/to/other/.kube/config

$ export $KUBECONFIG=/path/to/other/.kube/config

加载 / 合并 kubeconfig的详细的例子和说明在 kubeconfig-file

集群安全认证