Kubernetes 1.4が出たので変更点をざっとみてみました。主に下記の情報を参考にしています。
- Kubernetes 1.4: Making it easy to run on Kubernetes anywhere
- Kubernetes Feature tracking board (1.4 release)
ScheduledJobs (alpha)
ScheduledJobsというcronに相当するスケジュールベースのジョブの仕組みが追加されました。
下記のような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: 現在実行しているジョブを止めて新しいジョブで置き換える
Container Image Policy (alpha)
コンテナイメージに対して任意のチェックを行うためのWebhookの仕組みが追加されました。
Kubernetes: Image Policy Webhookとは に概要をまとめています。
Access Review APIs (alpha)
Kubernetes APIに対してのアクセス権があるかどうかのチェックを試せるWebAPIが追加されました。権限設定のデバッグなどに便利そうです。
下記のようなリクエストを送ると許可されているどうかが返ってくるイメージのようです。
{
  "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のように簡単にクラスタを組めるようになりそうです。
- 各種コンポーネントのインストール
- 
kubelet,docker,kubeadm,kubectlをapt-get, yumでインストールする
- マスターの初期化
- kubeadm init --use-kubernetes-version v1.4.0-beta.11
- ノードの追加
- kubeadm join --token <token> <master-ip>
- Podネットワークのインストール
- 
kubectl apply -f https://git.io/weave-kube(WeaveNetの例)
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というアノテーションを付加することでストレージの種類を指定できるようです。
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自体はまた別途リソースとして定義し、プロビジョナーを指定するようです。
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  zone: us-east-1d
  iopsPerGB: "10"
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はマニュアルより)
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" ]
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より)
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
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サーバー側に統一されました。
Enable non-go clients: Move to Swagger 2.0 (beta)
swagger 2.0(OpenAPI)に対応し、golang以外のクライアントの生成が容易になりました。
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"`
ストレージのVolume Pluginの追加
- New Volume Plugin: Quobyte
- QuobyteのVolume Pluginが追加されました。
 
- New Volume Plugin: Azure Data Disk
- Microsoft AzureのAzure Data DiskのVolume Pluginが追加されました。
 
Federation
Federation(複数クラスタの連携機能)関連は着々と各機能が実装されているようです。
- Federated Ingress for GCP (alpha)
- Federated Replica Set (beta)
- Federated Namespaces (plpha)
- Federated Secrets (beta)
- Federation Events (beta)
- Simplified turn up (alpha)
- Provide Ingress for Multi-Zone Clusters (alpha)