不需要编写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コンテナにアクセスする

なお、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" "-"
如果将访问日志输出到标准输出中,则可以实时查看日志。