こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。
今回は、kubenetesでローカルコンテナイメージからコンテナを作成する方法を紹介します。
以下では、Docker Hubへ接続できない状態でコンテナを作成しています。
YAMLファイルで「image:nginx」としか書いてないので、以下から頑張って取ろうとしますが、当然イメージ取得ができません。
https://hub.docker.com/_/nginx
bash-3.2$ cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ImagePullBackOff 0 4s <----イメージを取ろうとしてるのだが、、、
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ErrImagePull 0 30s <----無理だった orz
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ImagePullBackOff 0 4s <----イメージを取ろうとしてるのだが、、、
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ErrImagePull 0 30s <----無理だった orz
しかし、ローカルには「nginx」があるので、どうにかこれを利用したい!
bash-3.2$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kujiraitakahiro/nginx_unit unit-1.7-full-ready 74c74a4a7dda 4 days ago 263MB
<none> <none> d7e90ef0890d 6 days ago 263MB
nginx latest f09fe80eb0e7 13 days ago 109MB <----これを使いたい!
nginx/unit 1.7-full 6460aea482f7 2 months ago 215MB
k8s.gcr.io/kubernetes-dashboard-amd64 v1.10.1 f9aed6605b81 2 months ago 122MB
k8s.gcr.io/kube-proxy-amd64 v1.10.11 7387003276ac 2 months ago 98.3MB
k8s.gcr.io/kube-apiserver-amd64 v1.10.11 e851a7aeb6e8 2 months ago 228MB
k8s.gcr.io/kube-controller-manager-amd64 v1.10.11 978cfa2028bf 2 months ago 151MB
k8s.gcr.io/kube-scheduler-amd64 v1.10.11 d2c751d562c6 2 months ago 51.2MB
docker/kube-compose-controller v0.4.12 02a45592fbea 5 months ago 27.8MB
docker/kube-compose-api-server v0.4.12 0f92c77fa676 5 months ago 41.2MB
nginx/unit 1.3-php7.0 899eac6ee7bf 7 months ago 125MB
k8s.gcr.io/etcd-amd64 3.1.12 52920ad46f5b 11 months ago 193MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 1.14.8 c2ce1ffb51ed 13 months ago 41MB
k8s.gcr.io/k8s-dns-sidecar-amd64 1.14.8 6f7f2dc7fab5 13 months ago 42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64 1.14.8 80cc5ea4b547 13 months ago 50.5MB
k8s.gcr.io/pause-amd64 3.1 da86e6ba6ca1 14 months ago 742kB
REPOSITORY TAG IMAGE ID CREATED SIZE
kujiraitakahiro/nginx_unit unit-1.7-full-ready 74c74a4a7dda 4 days ago 263MB
<none> <none> d7e90ef0890d 6 days ago 263MB
nginx latest f09fe80eb0e7 13 days ago 109MB <----これを使いたい!
nginx/unit 1.7-full 6460aea482f7 2 months ago 215MB
k8s.gcr.io/kubernetes-dashboard-amd64 v1.10.1 f9aed6605b81 2 months ago 122MB
k8s.gcr.io/kube-proxy-amd64 v1.10.11 7387003276ac 2 months ago 98.3MB
k8s.gcr.io/kube-apiserver-amd64 v1.10.11 e851a7aeb6e8 2 months ago 228MB
k8s.gcr.io/kube-controller-manager-amd64 v1.10.11 978cfa2028bf 2 months ago 151MB
k8s.gcr.io/kube-scheduler-amd64 v1.10.11 d2c751d562c6 2 months ago 51.2MB
docker/kube-compose-controller v0.4.12 02a45592fbea 5 months ago 27.8MB
docker/kube-compose-api-server v0.4.12 0f92c77fa676 5 months ago 41.2MB
nginx/unit 1.3-php7.0 899eac6ee7bf 7 months ago 125MB
k8s.gcr.io/etcd-amd64 3.1.12 52920ad46f5b 11 months ago 193MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 1.14.8 c2ce1ffb51ed 13 months ago 41MB
k8s.gcr.io/k8s-dns-sidecar-amd64 1.14.8 6f7f2dc7fab5 13 months ago 42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64 1.14.8 80cc5ea4b547 13 months ago 50.5MB
k8s.gcr.io/pause-amd64 3.1 da86e6ba6ca1 14 months ago 742kB
そこで使うのが、「imagePullPolicy」です。
このパラメータを「IfNotPresent」や「Never」とすることで、ローカルイメージを使用からコンテナ作成ができます。
IfNotPresent・・・ローカルになければ、Docker hubからpull
Never・・・ローカルのみからpull
https://kubernetes.io/docs/concepts/configuration/overview/
imagePullPolicy: IfNotPresentの場合
bash-3.2$ cat nginx2.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent <-------ここ
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx2.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 6s
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent <-------ここ
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx2.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 6s
imagePullPolicy: Neverの場合
bash-3.2$ cat nginx3.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Never <-------ここ
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx3.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4s
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Never <-------ここ
ports:
- containerPort: 80
bash-3.2$ kubectl apply -f nginx3.yaml
pod/nginx created
bash-3.2$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4s