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)