最近、Kubernetes 1.16を使い始めました。ただ、Kubernetes 1.15まで問題なく動いていたYAMLファイルを使ってPodを作ろうとすると、なんかうまくいかないのでおかしいなと思ったのですが、APIがとうとう削除されたのが原因でした。
ChangeLogをきちんとみていればはまらない問題でした。1.15のChangeLogでも予告されてました。ただしKubernetes 1.15では本例の変更前と変更後のYAMLどちらの記述でも通ります。1.16以降は --runtime-config で再度有効にしない限り、変更が必要です。
デフォルトでは無効にされたAPIは次で確認できます。
Kubernetes 1.16からは「Deployment apps/v1」を使う
なので、次のようなYAMLを使っていたのであれば
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginxapp1
spec:
replicas: 1
template:
metadata:
labels:
app: nginxapp1
spec:
containers:
- name: nginxapp1
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginxapp1-nodeport
labels:
app: nginxapp1
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginxapp1
次のように変えれば良いそうです。最初「言われたようにselectorとappをspecの中に書いたのになんで通らないのかなと思っていたら、 matchLabelsが必要だったという話でした。ちゃんとエラーをみないといけませんね。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxapp1
spec:
replicas: 1
selector:
matchLabels:
app: nginxapp1
template:
metadata:
labels:
app: nginxapp1
spec:
containers:
- name: nginxapp1
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginxapp1-nodeport
labels:
app: nginxapp1
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
selector:
app: nginxapp1
YAMLをブログに貼り付けた際にインデントが不足している箇所がある可能性があります。ご了承ください。