k8s学习(二)

基于《Kubernetes in Action》

源码仓库


服务(service):


为一组功能相同的pod提供单一不变的接入点,即服务存在时,它的IP地址和端口不会改变。

一般我们还是采用yaml文件来创建服务,eg:

1
2
3
4
5
6
7
8
9
10
11
12

apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80 # 服务的端口
targetPort: 8080 # 转发到容器的端口
selector:
app: kubia

可以通过在一个已存在的pod中执行命令来进行测试

kubectl exec [pod_name] -- curl -s ip 指定节点执行curl命令

– :表示kubectl命令项的结束

-s : 表示需连接不同的API服务器而不是默认的

在spec字段中指定 sessionAffinity: ClientIP 则所有请求会转化到同一个(即一开始确定的那个)

一个服务可以暴露多个端口,但必须给每个端口指定名字。

服务发现

  1. 通过环境变量发现服务

    当服务的创建早于pod的创建时,pod上的进程会根据环境变量获得服务的IP地址和端口号。

    kubectl exec [pod_name] env 获取环境变量

  2. FQDN(全限定域名)连接

    进入节点bash后,如果知道服务名称,可以直接访问服务名(通过DNS解析域名)

ping 服务名或者其IP是ping不通的,因为服务的集群IP只是个虚拟IP,只在与服务端口结合时才有意义。

endpoint:

介于服务和pod之间的资源

当服务没有指定标签选择器时,就不知道包含哪些pod,则endpoint也不会被创建。所以对该类服务需要我们手动创建endpoint, name必须保持一致。

eg:

1
2
3
4
5
6
7
8
9
10
11
12

apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 11.11.11.11
- ip: 22.22.22.22
ports:
- port: 80

通过endpoint公开外部服务

同样我们也可以用FQDN访问外部服务:

创建ExternalName类型的外部服务:

1
2
3
4
5
6
7
8
9
10
11

apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName # 声明type
externalName: api.somecompany.com # 指向的服务域名
ports:
- port: 80

服务暴露给外部客户端

  1. NodePort: 集群中每个节点都打开一个端口,使得不仅可以通过服务的内部集群访问NodePort服务,还可以通过任何节点的IP和预留节点端口访问NodePort服务。

    创建eg:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    apiVersion: v1
    kind: Service
    metadata:
    name: kubia-nodeport
    spec:
    type: NodePort
    ports:
    - port: 80
    targetPort: 8080 # 转发端口号
    nodePort: 30123 # 互联网可以通过该集群上节点的ip:30123访问服务,不指定的化将随机分配一个端口
    selector:
    app: kubia

  1. 负载均衡器暴露服务:

    负载均衡器拥有自己的可公开访问的ip地址,并将所有连接重定向到服务。所以可通过该ip来访问。

    创建LoadBalance服务:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    apiVersion: v1
    kind: Service
    metadata:
    name: kubia-loadbalancer
    spec:
    type: LoadBalancer
    ports:
    - port: 80
    targetPort: 8080
    selector:
    app: kubia

  1. Ingress暴露服务:

    根据HTTP请求的主机名和路径决定请求转发到的服务

    1

    k3s默认配置有ingress, 创建文件:

    eg:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: kubia
    spec:
    rules:
    - host: kubia.example.com
    http:
    paths:
    - path: /
    backend:
    serviceName: kubia-nodeport
    servicePort: 80


就绪探针:

也有三种类型:

  • Exec探针

  • HTTP GET探针

  • TCP socket探针

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

apiVersion: v1
kind: ReplicationController
metadata:
name: kubia
spec:
replicas: 3
selector:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: luksa/kubia
ports:
- name: http
containerPort: 8080
readinessProbe: # 创建exec指针
exec:
command:
- ls
- /var/ready

headless服务:

将spec->clusterIP属性设置为None,则服务变成headless服务。那么DNS服务器将返回属于该服务一部分的所有pod的ip。