kubernetes1.24从构建到躺平「三」

OS: Ubuntu Server 22.04

一: 在srv4节点上配置带有SSL的私有仓库

1) 生成证书

root@srv4:~# cd /etc/ssl/private
root@srv4:/etc/ssl/private# openssl genrsa -aes128 2048 > server.key
Enter PEM pass phrase:     # 输入密码
Verifying - Enter PEM pass phrase:

root@srv4:/etc/ssl/private# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:     # 输入密码
writing RSA key

root@srv4:/etc/ssl/private# openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:1000y.cloud
Organizational Unit Name (eg, section) []:Tech
Common Name (e.g. server FQDN or YOUR name) []:srv4.1000y.cloud
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

root@srv4:/etc/ssl/private# vim san.txt
# 添加新内容---便于生成一个包含 SAN(Subject Alternative Name)的证书
subjectAltName = DNS:*.1000y.cloud, IP:192.168.1.14

root@srv4:/etc/ssl/private# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -extfile san.txt
Certificate request self-signature ok
subject=C = CN, ST = BeiJing, L = BeiJing, O = 1000y.cloud, OU = Tech, CN = srv4.1000y.cloud

root@srv4:/etc/ssl/private# cd

2) 创建一个访问帐户

root@srv4:~# apt install apache2-utils podman -y

root@srv4:~# htpasswd -Bc /etc/containers/.htpasswd snow
New password:     # 设定一个密码
Re-type new password: 
Adding password for user snow


二: 在srv4节点上创建一个仓库

root@srv4:~# podman pull registry:2
Resolved "registry" as an alias (/etc/containers/registries.conf.d/shortnames.conf)
Trying to pull docker.io/library/registry:2...
Getting image source signatures
Copying blob fc30d7061437 done  
Copying blob 2408cc74d12b done  
Copying blob e69d20d3dd20 done  
Copying blob c87369050336 done  
Copying blob ea60b727a1ce done  
Copying config 773dbf02e4 done  
Writing manifest to image destination
Storing signatures
773dbf02e42e2691c752b74e9b7745623c4279e4eeefe734804a32695e46e2f3

root@srv4:~# mkdir /var/lib/containers/registry

root@srv4:~# podman run --privileged -d -p 5000:5000 \
-v /etc/containers:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/.htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
-v /etc/ssl/private:/certs \
-v /var/lib/containers/registry:/var/lib/registry \
registry:2
4997aa1a7bb83b6bfb7abe92ba7d6bc8a0f689da21c0a4db3e022d4f73990edf


三: 测试

1) Registry[仓库]测试

root@srv4:~# vim /etc/containers/registries.conf
......
......
......
......
......
......

# 于文件最后添加如下内容
[registries.search]
registries = ['docker.io']

[registries.insecure]
registries = ['srv4.1000y.cloud:5000']

root@srv4:~# podman pull nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 62c70f376f6a done  
Copying blob 7b1fab684d70 done  
Copying blob 75a963e94de0 done  
Copying blob 42c077c10790 done  
Copying blob 915cc9bd79c2 done
Writing manifest to image destination
Storing signatures
0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d

root@srv4:~# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx     latest      0e901e68141f  3 weeks ago  146 MB
docker.io/library/registry  2           773dbf02e42e  3 weeks ago  24.6 MB

root@srv4:~# podman tag docker.io/library/nginx:latest srv4.1000y.cloud:5000/nginx

root@srv4:~# podman login srv4.1000y.cloud:5000
Username: snow
Password: 
Login Succeeded!

root@srv4:~# podman push srv4.1000y.cloud:5000/nginx:latest
Getting image source signatures
Copying blob 33e3df466e11 done  
Copying blob 747b7a567071 done  
Copying blob 57d3fc88cb3f done  
Copying blob 53ae81198b64 done  
Copying blob 58354abe5f0e done  
Copying blob ad6562704f37 done  
Copying config 0e901e6814 done  
Writing manifest to image destination
Storing signatures

root@srv4:~# curl --user snow:123456 -XGET https://srv4.1000y.cloud:5000/v2/_catalog -k
{"repositories":["nginx"]}

2) 客户端测试

(1) 修改相关的配置文件
root@srv1:~# vim /etc/containerd/config.toml
......
......
......
......
......
......

    [plugins."io.containerd.grpc.v1.cri".registry]
      # 于145行,进行修改。指定registry配置文件所在目录
      config_path = "/etc/containerd/certs.d"

      [plugins."io.containerd.grpc.v1.cri".registry.auths]
        # 于148行,添加认证帐户的信息
        [plugins."io.containerd.grpc.v1.cri".registry.configs."srv4.1000y.cloud:5000".auth]
          username = "snow"
          password = "123456"

......
......
......
......
......
......

root@srv1:~# mkdir -p /etc/containerd/certs.d/srv4.1000y.cloud:5000/
root@srv1:~# vim /etc/containerd/certs.d/srv4.1000y.cloud:5000/hosts.toml
[host."https://srv4.1000y.cloud:5000"]
  capabilities = ["pull", "resolve", "push"]
  ca = "/etc/containerd/certs.d/srv4.1000y.cloud:5000/ca.crt"

root@srv1:~# scp srv4.1000y.cloud:/etc/ssl/private/server.crt /etc/containerd/certs.d/srv4.1000y.cloud:5000/ca.crt
root@srv1:~# systemctl restart containerd.service

(2) 测试
root@srv1:~# crictl pull srv4.1000y.cloud:5000/nginx
Image is up to date for sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d

root@srv1:~# crictl images | grep nginx
srv4.1000y.cloud:5000/nginx                                       latest              0e901e68141fd       59.2MB

3) 其他
如果测试成功,请将其他的k8s节点的containerd服务的私有仓库配置完成


四: 将验证信息加入至Docker credentials中[K8S Master节点操作]

1) 创建Regcred

root@srv1:~# kubectl create secret docker-registry regcred \
--docker-server=srv4.1000y.cloud:5000 \
--docker-username=snow \
--docker-password=123456
secret/regcred created

root@srv1:~# kubectl get secrets
NAME      TYPE                                            DATA   AGE
regcred      kubernetes.io/dockerconfigjson   1           10s
regcred      kubernetes.io/dockerconfigjson   1           20s

2) 查看regcred详细信息

root@srv1:~# kubectl get secret regcred --output=yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJzcnY0LjEwMDB5LmNsb3VkOjUwMDAiOnsidXNlcm5hbWUiOiJzbm93IiwicGFzc3dvcmQiOiIxMjM0NTYiLCJhdXRoIjoiYzI1dmR6b3hNak0wTlRZPSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2022-06-21T08:14:19Z"
  name: regcred
  namespace: default
  resourceVersion: "7659"
  uid: 9e5152c0-b395-40dc-995f-f7163cd8aa7b
type: kubernetes.io/dockerconfigjson

3) 用Base64查看regcred中用户名及密码

root@srv1:~# kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 -d
{"auths":{"srv4.1000y.cloud:5000":{"username":"snow","password":"123456","auth":"c25vdzoxMjM0NTY="}}}


五: 测试K8S与私有仓库的互动

1) 确认私有仓库是否存在nginx镜像

root@srv1:~# curl --user snow:123456 -XGET https://srv4.1000y.cloud:5000/v2/_catalog -k
{"repositories":["nginx"]}

2) 于私有仓库pull一个镜像并启动一个Pod

root@srv1:~# vim private-nginx.yml
# 于新文件内添加如下内容
apiVersion: v1
kind: Pod
metadata:
  name: private-nginx
spec:
  containers:
  - name: private-nginx
    # 设定私有仓库及镜像
    image: srv4.1000y.cloud:5000/nginx
  imagePullSecrets:
   # 添加认证名称
  - name: regcred

root@srv1:~# kubectl create -f private-nginx.yml
pod/private-nginx created

root@srv1:~# kubectl get pods
NAME            READY   STATUS    RESTARTS   AGE
private-nginx   1/1     Running   0          23s

root@srv1:~# kubectl describe pods private-nginx
Name:         private-nginx
Namespace:    default
Priority:     0
Node:         srv2.1000y.cloud/192.168.1.12
Start Time:   Tue, 21 Jun 2022 16:22:42 +0800
Labels:       
Annotations:  
Status:       Running
IP:           10.244.2.2
IPs:
  IP:  10.244.2.2
Containers:
  private-nginx:
    Container ID:   containerd://002bb89a7f0fc8ae3faf2e9dc9169e9df48f9a26ec626b16f27052e72f33986c
    Image:          srv4.1000y.cloud:5000/nginx
    Image ID:       srv4.1000y.cloud:5000/nginx@sha256:65b1ea5e1db59668e46e2a8e2090522358bead4124609f77f2509f482b631b4d
    Port:           
    Host Port:      
    State:          Running
      Started:      Tue, 21 Jun 2022 16:22:54 +0800
    Ready:          True
    Restart Count:  0
    Environment:    
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7kjwz (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-7kjwz:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  46s   default-scheduler  Successfully assigned default/private-nginx to srv2.1000y.cloud
  Normal  Pulling    45s   kubelet            Pulling image "srv4.1000y.cloud:5000/nginx"
  Normal  Pulled     35s   kubelet            Successfully pulled image "srv4.1000y.cloud:5000/nginx" in 10.095096643s
  Normal  Created    34s   kubelet            Created container private-nginx
  Normal  Started    34s   kubelet            Started container private-nginx
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章