问题:
之前域名备案没有通过,harbor使用的是nodePort方式来进行访问的。现在通过了,修改成域名方式访问。
解决:
1.添加二级域名解析
登录阿里云(你的域名所在服务商),打开云解析DNS,点击域名,添加记录。
公网可以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
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
4.添加ingress
查看harbor-portal svc的端口。
kubectl get svc -n harbor
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
5.访问网站
6.坑
harbor-helm-1.3.10自带的ingress.yaml在k8s 1.22中无法运行。其他版本未测试。
报错yaml文件格式有问题。在yaml文件格式校验网站上测试是有报错。
ingress生效后,访问域名报错404。
查看ingress日志。
k logs -f --tail=50 ingress-nginx-ingress-controller-557b9f5d7-xfnln -n ingress
查看nginx配置。
kubectl exec -it ingress-nginx-ingress-controller-557b9f5d7-xfnln -n ingress -- bash
ps aux
cat /etc/nginx/nginx.conf
可以看到 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的后端。
原因是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
访问正常。