k8s

harbor使用域名访问

问题:

之前域名备案没有通过,harbor使用的是nodePort方式来进行访问的。现在通过了,修改成域名方式访问。

解决:

1.添加二级域名解析

登录阿里云(你的域名所在服务商),打开云解析DNS,点击域名,添加记录。
file
公网可以ping通域名,证明域名解析已生效。

2.添加证书

生成ca证书
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/CN=harbor.wghdr.top"  -key ca.key -out ca.crt 
生成服务器证书
创建私钥
openssl genrsa -out harbor.wghdr.top.key 4096
生成证书签名请求
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=zhejiang/O=wghdr/OU=Personal/CN=harbor.wghdr.top" -key harbor.wghdr.top.key -out harbor.wghdr.top.csr
生成harbor仓库主机的证书
首先创建一个 v3.ext 文件
cat v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.wghdr.top

openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial  -in harbor.wghdr.top.csr -out harbor.wghdr.top.crt
可以转换一下格式
openssl x509 -inform PEM -in harbor.wghdr.top.crt -out harbor.wghdr.top.cert

file

3.添加secret

kubectl create secret tls harbor.wghdr.top  --key harbor.wghdr.top.key --cert harbor.wghdr.top.crt -n harbor
kubectl get secret -n harbor

file

4.添加ingress

查看harbor-portal svc的端口。

kubectl get svc -n harbor

file

cat ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: harbor-ingress
  namespace: harbor
spec:
  ingressClassName: nginx
  rules:
  - host: harbor.wghdr.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-portal
            port:
              number: 8080
      - path: /api/
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-core
            port:
              number: 8080
      - path: /service/
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-core
            port:
              number: 8080
      - path: /v2/
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-core
            port:
              number: 8080
      - path: /chartrepo/
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-core
            port:
              number: 8080
      - path: /c/
        pathType: Prefix
        backend:
          service:
            name: harbor-harbor-core
            port:
              number: 8080
  tls:
  - hosts:
    - harbor.wghdr.top
    secretName: harbor.wghdr.top

kubectl apply -f ingress.yaml

file

5.访问网站

file

6.坑

harbor-helm-1.3.10自带的ingress.yaml在k8s 1.22中无法运行。其他版本未测试。

报错yaml文件格式有问题。在yaml文件格式校验网站上测试是有报错。
file

ingress生效后,访问域名报错404。

查看ingress日志。

k logs -f --tail=50 ingress-nginx-ingress-controller-557b9f5d7-xfnln -n ingress

file
查看nginx配置。

kubectl exec -it ingress-nginx-ingress-controller-557b9f5d7-xfnln -n ingress -- bash
ps aux
cat /etc/nginx/nginx.conf

file
file
可以看到 server块的location中,server_name,server_port,为空,proxy_upstream_name为upstream- default-backend,所以就转发到了 [upstream-default-backend] [] 10.100.104.7:8080(ingress-nginx-ingress-controller-default-backend-788f885dfgd4px pod的IP)

访问域名报错503,nginx转发不到harbor-portal的后端。

file
原因是ingress文件有问题。如下:

[root@master harbor-helm-1.3.10]# cat templates/ingress/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: harbor.wghdr.top
  namespace: harbor
spec:
  ingressClassName: nginx
  rules:
  - host: harbor.wghdr.top
  - http:
      paths:
      - path: /
        pathType: ImplementationSpecific的 # 这里要用Prefix
        backend:
          service:
            name: harbor-harbor-portal
            port:
              number: 80  # 后端服务端口已经修改成了8080,ingress里还是80
  tls:
  - hosts:
    - harbor.wghdr.top
    secretName: harbor.wghdr.top

修改成上面步骤4中的配置后,重新apply。
查看nginx的配置如下:

cat /etc/nginx/nginx.conf | grep harbor

file
访问正常。
file

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x