Contents
概要
KubernetesのNginxコンテナに対してServiceオブジェクトのNodePortを介して接続します。NodePortを使用するとCluster外から接続可能となります。
手順
Namespace
複数のオブジェクトが作成される為、専用のNamespaceを作成します。
Namespaceの作成
root@k8s-01:~# kubectl create namespace nginx-nodeport-ns
namespace/nginx-nodeport-ns created
Namespaceの確認
root@k8s-01:~# kubectl get namespace
NAME STATUS AGE
nginx-nodeport-ns Active 17s
Deployment
Deployment用Manifestの作成
Pod用Manifestを作成します。Serviceを使用する場合は複数のPodが想定される為、Deploymentで作成します。
root@k8s-01:~# vim /root/k8s/yaml/nginx-nodeport-dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-nodeport-dep
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
Deployment用Manifestの実行
Deployment用ManifestからDeploymentを作成します。
root@k8s-01:~# kubectl create -n nginx-nodeport-ns -f /root/k8s/yaml/nginx-nodeport-dep.yaml
deployment.apps/nginx-nodeport-dep created
Deploymentのステータス確認
Deploymentのステータスを確認します。
root@k8s-01:~# kubectl get deployment -n nginx-nodeport-ns
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-nodeport-dep 2/2 2 2 27s
Service
Service用Manifestの作成
Service用Manifestを作成します。「type: NodePort」を指定しています。
root@k8s-01:~# vim /root/k8s/yaml/nginx-nodeport-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport-svc
spec:
selector:
app: nginx
ports:
- port: 80
type: NodePort
Service用Manifestの実行
Service用ManifestからServiceを作成します。
root@k8s-01:~# kubectl create -n nginx-nodeport-ns -f /root/k8s/yaml/nginx-nodeport-svc.yaml
service/nginx-nodeport-svc created
Serviceのステータス確認
Serviceのステータスを確認します。ClusterIPに10.103.227.70がアサインされており、Nodeに32054/TCPで着信した場合は、10.103.227.70:80に転送される状態となっています。Nodeのiptablesルールを確認すると分かりますが、KUBE-SERVICES(ユーザチェイン)に設定され、KUBE-SERVICESはPREROUTINGチェインに組み込まれています。つまりiptablesでDNATをしているだけですね。
root@k8s-01:~# kubectl get service -n nginx-nodeport-ns NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-nodeport-svc NodePort 10.103.227.7080:32054/TCP 28s
オブジェクト全体の確認
nginx-clusterip-nsの全オブジェクトを確認します。
root@k8s-01:~# kubectl get all -n nginx-nodeport-ns -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx-nodeport-dep-6799fc88d8-6jvpv 1/1 Running 0 10m 10.255.179.60 k8s-02pod/nginx-nodeport-dep-6799fc88d8-zqjjd 1/1 Running 0 10m 10.255.179.59 k8s-02 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/nginx-nodeport-svc NodePort 10.103.227.70 80:32054/TCP 7m41s app=nginx NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/nginx-nodeport-dep 2/2 2 2 10m nginx nginx app=nginx NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset.apps/nginx-nodeport-dep-6799fc88d8 2 2 2 10m nginx nginx app=nginx,pod-template-hash=6799fc88d8
NodePortを介したNginxコンテナの動作確認
NodePortを介してNginxコンテナにHTTPで接続
Cluster外のホストからNodeIPにcurlで接続すると応答があります。これはMaster NodeでもWorker Nodeでも関係ありません。Cluster内ではClusterIPを参照すれば良いでしょう。
root@k8s-01:~# curl 192.168.68.11:32054
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
環境の削除
本稿で作成した環境を削除します。
root@k8s-01:~# kubectl delete namespace nginx-nodeport-ns
namespace "nginx-nodeport-ns" deleted