k8s学习笔记

本文详细介绍了在Kubernetes集群中的管理操作,包括安装网络插件以确保Pod间通信,通过k8s API访问集群的多种方法,如使用kubectl代理、编程方式访问,以及从Pod内部进行访问。此外,还探讨了如何访问运行在集群中的服务,如通过服务账号凭证进行安全通信。最后,文章讲解了DNS服务的自动缩放策略,以及配置Pod和容器的内存、CPU限制,以及如何定义和使用扩展资源。
摘要由CSDN通过智能技术生成

管理集群

安装网络插件

如果要让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 客户端(如 curlwget,或浏览器)直接访问 REST API,可以通过多种方式对 API 服务器进行定位和身份验证:

  1. 以代理模式运行 kubectl(推荐)。 使用存储的 apiserver 位置并使用自签名证书验证 API 服务器的标识。可以防止中间人(MITM)攻击。
  2. 另外,也可以直接为 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 官方支持 GoPython 的客户端库.

例: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值