Kubernetes 1.4の変更点

Kubernetes 1.4が出たので変更点をざっとみてみました。主に下記の情報を参考にしています。

- [Kubernetes 1.4: Making it easy to run on Kubernetes anywhere](http://blog.kubernetes.io/)
- [Kubernetes Feature tracking board (1.4 release)](https://docs.google.com/spreadsheets/d/1MeTQbtSiTCoQ74zjEGRI1rXRSP0Tzmo9-kMJSK_HGoA/edit#gid=0)


## ScheduledJobs (alpha)
ScheduledJobsというcronに相当するスケジュールベースのジョブの仕組みが追加されました。

下記のようなyamlでジョブを設定するようです。(マニュアルより)

```yaml
apiVersion: batch/v2alpha1
kind: ScheduledJob
metadata:
  name: hello
spec:
  schedule: 0/1 * * * ?
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
```

cronの機能に加え`.spec.concurrencyPolicy`という項目で並行実行の制御ポリシーを指定できます。

- **Allow**: (デフォルト) 並行実行を許可する
- **Forbid**: 並行実行を禁止する。前回のものが終了していなければスキップする
- **Replace**: 現在実行しているジョブを止めて新しいジョブで置き換える


http://kubernetes.io/docs/user-guide/scheduled-jobs/

## Container Image Policy (alpha)
コンテナイメージに対して任意のチェックを行うためのWebhookの仕組みが追加されました。

[Kubernetes: Image Policy Webhookとは](http://qiita.com/tkusumi/items/4013123f3981de96986b) に概要をまとめています。

## Access Review APIs (alpha)
Kubernetes APIに対してのアクセス権があるかどうかのチェックを試せるWebAPIが追加されました。権限設定のデバッグなどに便利そうです。

下記のようなリクエストを送ると許可されているどうかが返ってくるイメージのようです。

```json
{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "namespace": "kittensandponies",
      "verb": "GET",
      "group": "unicorn.example.org",
      "resource": "pods"
    },
    "user": "jane",
    "group": [
      "group1",
      "group2"
    ]
  }
}
```

- https://github.com/kubernetes/features/issues/37
- http://kubernetes.io/docs/admin/authorization/#checking-api-access

## Dramatically Simplify Kubernetes Cluster Creation (alpha)
`kubeadm`という新しいコマンドが追加されクラスタの構築が非常に容易になりました。マニュアルによると以下の手順だけでクラスタの構築ができるようです。Swarmの`swarm init/join`のように簡単にクラスタを組めるようになりそうです。

1. 各種コンポーネントのインストール
  -  `kubelet`, `docker`, `kubeadm`, `kubectl`をapt-get, yumでインストールする
2. マスターの初期化
  - `kubeadm init --use-kubernetes-version v1.4.0-beta.11`
3. ノードの追加
  - `kubeadm join --token <token> <master-ip>`
4. Podネットワークのインストール
  - `kubectl apply -f https://git.io/weave-kube` (WeaveNetの例)

- http://kubernetes.io/docs/getting-started-guides/kubeadm/

## Kubelet TLS Bootstrap (alpha)
`kubeadm`で簡単にデプロイできるようになるために、TLSのブートストラップの機能が追加されたようです。今まではクラスタのデプロイはクライアント証明書の発行などTLS周りの設定が大変でした。1.4では内部にCAの仕組みが追加され、各ノードが自動的にCSR(証明書署名要求)を送り、これを承認するだけで証明書のデプロイが行われるようになったようです。

- https://github.com/kubernetes/features/issues/43
- http://kubernetes.io/docs/admin/master-node-communication/#kubelet-tls-bootstrap
- https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/kubelet-tls-bootstrap.md

## Configurable Dynamic Provisioning aka StorageClass (beta)
1.3までのPersisnt Volume Claim(動的にPersisnte Volumeを確保するリソース)ではクラスタ毎に1つのプロビジョナーしか使用できませんでした。1.4では新しくStorageClassというものが追加され、複数のプロビジョナーを利用できるようになるようです。

下記のようにPersisnt Volume Claimに`volume.beta.kubernetes.io/storage-class`というアノテーションを付加することでストレージの種類を指定できるようです。

```yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
  annotations:
    volume.beta.kubernetes.io/storage-class: "slow"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}
```

`StorageClass`自体はまた別途リソースとして定義し、プロビジョナーを指定するようです。

```yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  zone: us-east-1d
  iopsPerGB: "10"
```

- http://kubernetes.io/docs/user-guide/persistent-volumes/#class


## Add sysctl support (alpha)
namespace化されているカーネルパラメータ(sysctl設定)をPodごとに設定できるようになりました。
安全な設定として下記が定義されています。

- `kernel.shm_rmid_forced`
- `net.ipv4.ip_local_port_range`
- `net.ipv4.tcp_max_syn_backlog`
- `net.ipv4.tcp_syncookies`

デフォルトでは無効にされているunsafeな設定として以下があるようです。(kubeletのオプションで`--experimental-allowed-unsafe-sysctls`で設定できる)

- `kernel.msg*`
- `kernel.sem`
- `kernel.shm*`
- `fs.mqueue.*`
- `net.*`

## Add AppArmor support (beta)

Podに対してAppArmorのプロファイルの設定ができるようになりました。`container.apparmor.security.beta.kubernetes.io/<container_name>`というアノテーションを使ってサーバーにロードされているAppArmorのプロファイルを以下のように設定できるようです。(yamlはマニュアルより)

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".
    # Note that this is ignored if the Kubernetes node is not running version 1.4 or greater.
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write
spec:
  containers:
  - name: hello
    image: busybox
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
```

- http://kubernetes.io/docs/admin/apparmor/
- https://github.com/kubernetes/features/issues/24

## Inter-pod affinity/anti-affinity (alpha)

スケジューラに対しPodをどうスケジューリングするかを指定する機能です。例えばPod Aが動作しているノードでPod Bを動かしたいといった場合、もしくは逆の場合など高度なスケジューリングの指定ができます。


- https://github.com/kubernetes/features/issues/51
- http://kubernetes.io/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-alpha-feature
- https://github.com/kubernetes/kubernetes/blob/master/docs/design/podaffinity.md

## Pod Security Policy

クラスタレベルでPodが何をできるかなどのセキュリティポリシー(特権コンテナの実行可否、使えるLinux Capabilitiesなど)をkubernetesのリソースとして制御できるようになりました。

- https://github.com/kubernetes/features/issues/5
- http://kubernetes.io/docs/user-guide/pod-security-policy/


## Audit (alpha)
KubernetesのAPI Serverの監査ログを残す仕組みが追加されました。

下記のようなログを残すようです。(PR [Basic audit log #27087](https://github.com/kubernetes/kubernetes/pull/27087)より)

```
AUDIT: id="b0a443ae-f7d8-408c-a355-eb9501fd5c59" ip="192.168.121.118" method="GET" user="system:admin" as="test-admin" namespace="openshift" uri="/api/v1/namespaces/openshift/pods/python"
AUDIT: id="b0a443ae-f7d8-408c-a355-eb9501fd5c59" response=200
```

- https://github.com/kubernetes/features/issues/22

## Prioritized scheduling of critical cluster addon pods (alpha)

クラスタの重要コンポーネント(DNS, Heapsterなど)に対してスケジューラが優先的に扱う機能が追加されました。 優先的に扱う条件は以下のようです。

- `kube-system`ネームスペース内(変更可)
- `scheduler.alpha.kubernetes.io/critical-pod`ラベルが空で設定されている
- `scheduler.alpha.kubernetes.io/tolerations`ラベルが`[{"key":"CriticalAddonsOnly", "operator":"Exists"}]`にに設定されている

参考

- https://github.com/kubernetes/features/issues/62
- http://kubernetes.io/docs/admin/rescheduler/#guaranteed-scheduling-of-critical-add-on-pods

## System Correctness: Single Source for Default Values (stable)
現状リソースのデフォルト値をクライアント(kubectl)、APIサーバー両方で設定していたのが、APIサーバー側に統一されました。

- https://github.com/kubernetes/features/issues/55

## Enable non-go clients: Move to Swagger 2.0 (beta)

swagger 2.0(OpenAPI)に対応し、golang以外のクライアントの生成が容易になりました。

- https://github.com/kubernetes/features/issues/53

## kubelet evicts resources when observing disk pressure (beta)

ノードのディスクが圧迫されてきたときにもkubeletがPodを立ち退かせるようになったようです。下記のようにkubeletの`--eviction-hard`, `--eviction-minimum-reclaim`オプションで、`nodefs.available`というディスク容量を設定するようです。

```
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
```

- http://kubernetes.io/docs/admin/out-of-resource/
- https://github.com/kubernetes/features/issues/39

# ストレージのVolume Pluginの追加
- New Volume Plugin: Quobyte
  - [Quobyte](https://www.quobyte.com/)のVolume Pluginが追加されました。
- New Volume Plugin: Azure Data Disk
  - Microsoft Azureの[Azure Data Disk](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-about-disks-vhds/#data-disk)のVolume Pluginが追加されました。


## Federation

Federation(複数クラスタの連携機能)関連は着々と各機能が実装されているようです。

- [Federated Ingress for GCP](https://github.com/kubernetes/features/issues/82) (alpha)
- [Federated Replica Set](https://github.com/kubernetes/features/issues/46) (beta)
- [Federated Namespaces](https://github.com/kubernetes/features/issues/69) (plpha)
- [Federated Secrets](https://github.com/kubernetes/features/issues/68) (beta)
- [Federation Events](https://github.com/kubernetes/features/issues/70) (beta)
- Simplified turn up (alpha)
- [Provide Ingress for Multi-Zone Clusters](https://github.com/kubernetes/features/issues/52) (alpha)