---
# System prepended metadata

title: 2021-03-24 続・KubeproxyのService周りの動き

---

---
lang: ja
breaks: false
---

<style>
.ui-infobar, #doc.markdown-body { max-width: 75vw; }
</style>

# 2021-03-24 続・KubeproxyのService周りの動き

## 検証

Deployment

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```

Service

```
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
```

```
apiVersion: v1
kind: Service
metadata:
  name: my-service2
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
      nodePort: 30080
```

## 前回まででわかったこと

- ClusterIPでServiceを作ると2つのチェインがNAT Tableに作成される
    - KUBE-SVC-XXX => 1つのサービスに対応
    - KUBE-SEP-XXX => 1つのEndpointに対応、多分Service End Point
    - KUBE-SVC-XXXの下に複数KUBE-SEP-XXXがぶら下がっていてprobabilityモジュールのマッチでロードバランスされる
- NodePortは作成するとClusterIP + NATのルールが入る
    - 外側からの通信はMARK-MASQでSNATしつつ
    - あとはClusterIPと同じ仕組みでDNATする
    - externalTrafficPolicy
        - Cluster/Local共に期待通り
        - minikubeの場合だとnode間通信がないのでClusterにして他のノードにあるエンドポイントが選択された場合単に通じない
        - なんならIPアドレスもかぶる
- hostPort
    - ただ単にNode IP => Pod IPのDNATが入る
    - minikubeの場合だとdockerのデフォルトネットワークにPort forwardのルールが入る
- headless service
    - ClusterIPがないService
    - iptables的には何もない
- Podless service (セレクタに何もマッチしない等)
    - filter tableにClusterIP => REJECTのルールが入る
    - icmp-port-unreachableが届く
- ExternalIP (Service Typeではない)
    - 何に使うかあんまりわからない
    - 内部からの場合
        - そのままserviceチェインに飛ばされる
    - 外部からの場合
        - ExternalIPをNodeが持っている場合
            - そのままserviceチェインに飛ばされる
        - ExternalIPをNodeが持っていない場合
            - 一旦MASQされる？


