不需要编写YAML文件,直接从私有容器注册表启动nginx并访问

kubernetes初学者向けの記事となります。
kubernetes環境でPrivateのコンテナレジストリを立てた後、その動作確認をすることを目的にnginxを立てたいことがあるかと思いますが、その具体的な手順を記載しています。

前提 tí) in Chinese can be paraphrased as “先决条件” jué .

    • dockerが利用できること

 

    • Kubernetesが利用できること

 

    • Privateのコンテナレジストリが構築済みであること

 

    kubectl, dockerコマンドはインストール済みであること

将nginx推送到本地的港口。

从本地环境获取一个标签为latest的(亦可省略)nginx容器镜像。

docker pull nginx

在容器镜像中添加一个标签,其中包含本地容器注册表的URL。请根据您的环境适当替换my-registry.info/library的部分。

docker tag nginx my-registry.info/library/nginx

推动形象。

docker push my-registry.info/library/nginx

登记Private容器注册表的认证信息

如果私有容器注册表未公开为公共,未经身份验证将无法获取镜像。因此,需要事先注册认证信息。

kubectl create secret docker-registry my-registry --docker-password 'mypassword' --docker-username 'myusername' --docker-server 'my-regisry.info'

请将mypassword、myusername和my-regisry.info分别替换为您自己的账户信息。

首先,将身份验证信息关联到启动nginx容器的服务帐号上。
在使用Kubernetes时,必须使用一个被称为“服务帐号”的实体来启动资源。如果不特别指定,将使用默认的default服务帐号。
此次将关联到default命名空间中的default服务帐号上。

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-registry "}]}' -n default

启动nginx容器

使用Nginx容器启动Pod。

kubectl run --image my-registry.info/library/nginx nginx

使用image选项指定容器镜像,然后指定Pod名称(此处为nginx)。

等待几秒钟到几十秒后,容器将启动。使用kubectl get pod命令获取状态,如果状态为Running,则表示正常。

$ kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          25s

将nginx容器发布到公共环境中

次に作成したnginx Podを公開してnginxにアクセスできるようにします。
公開は3つあります。公開方法とざっくりとした意味は以下となります。

type: ClusterIP:主にPod間でアクセスするために利用する

type: NodePort:Podが起動しているHostのIP:Portを利用してkubernetesクラスタ外からアクセスする

type: LoadBalancer:LoadBalancerが管理しているIPなどを割り当ててkubernetesクラスタ外からアクセスする

この中で、type: LoadBalancerはLoadBalancerがいないとIPが割り当てられず外部からアクセスができないため、利用できる環境でのみ指定してください。
今回は利用できるものとして進みます。
kubectl exposeコマンドを利用すると外部に公開できるため、こちらを利用して公開します。

kubectl expose pod nginx --name nginx-svc --port 80 --type LoadBalancer

exposeの後のpodは公開する対象リソース、続くnginxはそのリソースの名前となります。
先程作成したnginxという名前のPodを公開するため、kubectl expose pod nginxとなります。
また、exposeを実行するとServiceというリソースが作成されますが、このServiceリソース名を–nameで指定しています。–portで公開Portを指定し、–typeで先程述べた公開方法を指定しています。
作成されたServiceリソースを見てみます。取得するにはkubectl get serviceで取得します。以下ではServiceの省略形svcを使って取得しています。

$ kubectl get svc nginx-svc
NAME        TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx-svc   LoadBalancer   10.98.80.43   10.220.21.6   80:31073/TCP   6s

当无事IP从负载均衡器中分配出来时,将显示上述的外部公共IP地址。
请注意,如果负载均衡器不存在或IP分配失败,EXTERNAL-IP将显示为。

$ kubectl get svc nginx-svc
NAME        TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx-svc   LoadBalancer   10.98.80.43   <pending>     80:31073/TCP   6s

nginxコンテナにアクセスする

image.png

なお、dockerhubで配布されているnginxコンテナは標準出力にログを吐いています。
ログは以下のコマンドで確認できます。

$ kubectl logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
:(省略)
192.168.3.1 - - [22/Dec/2022:03:51:14 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://10.220.21.6/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" "-"
192.168.3.1 - - [22/Dec/2022:03:52:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" "-"

如果将访问日志输出到标准输出中,则可以实时查看日志。

bannerAds