本文摘要:
8、安装代码自动补全
9、Helm安装
10、安装ingress-nginx
11、集群部署nfs动态存储
12、Openssl生成自签证书
13、集群部署harbor
14、集群部署gitlab
只在master上执行
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash >/etc/bash_completion.d/kubectl
只在master上执行
#安装wget
yum -y install wget
#下载helm二进制包#
wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
#解压二进制包
tar -xzvf helm-v3.8.0-linux-amd64.tar.gz
#移动二进制文件到bin下
mv linux-amd64/helm /usr/local/bin/helm
#删除二进制包及解压文件
rm -rf helm-v3.7.1-linux-amd64.tar.gz linux-amd64
安装bash-completion
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(helm completion bash)
helm completion bash > /etc/bash_completion.d/helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm search repo ingress-nginx --versions
helm pull ingress-nginx/ingress-nginx --version 4.0.17
tar -xzvf ingress-nginx-4.0.17.tgz
vi ingress-nginx/values.yaml
registry和image是修改镜像仓库和镜像名为阿里云的仓库(该仓库为个人用户仓库)。官方镜像国内网络基本拉取不下来,默认配置使用Deployment控制器,副本数为1。你可以修改为DaemonSet,每个节点部署一个pod,此处使用nodeSelector将ingress控制器固定在master上
controller:
image:
registry: registry.aliyuncs.com/google_containers # 第13行
image: nginx-ingress-controller # 第14行
hostNetwork: true # 第81行,设置使用主机网络,必须的
ingressClassResource:
default: true # 第101行,设置ingress-nginx为默认ingressClass控制器,否则使用ingress时需要指定使用nginx
tolerations: # 第212行,设置污点容忍度,在该行下面插入,请自行根据master上的污点设置
- key: "node-role.kubernetes.io/master"
operator: "Equal"
value: ""
effect: "NoSchedule"
nodeSelector:
kubernetes.io/os: linux
node-role.kubernetes.io/master: "master" # 第286行,选择master节点,需要master上有该标签
admissionWebhooks:
patch:
image:
registry: registry.aliyuncs.com/google_containers # 第600行
image: kube-webhook-certgen # 第601行
defaultBackend:
enabled: true # 第721行,启用默认后端,如果不需要,下面2行也不用改
image:
registry: registry.aliyuncs.com/google_containers # 第725行
image: defaultbackend # 第726行
tag: "1.4" # 第730行,目前没有同步1.5的镜像,改为1.4
kubectl create namespace ingress-nginx
helm install ingress-nginx ingress-nginx -n ingress-nginx
kubectl get pod -n ingress-nginx -o wide
#进行扩容,目的就是达到高可用
kubectl -n ingress-nginx scale deployment ingress-nginx-controller --replicas=3
浏览器访问master的ip地址,启用了默认后端则提示default backend - 404,如果没有启用默认后端,则提示nginx的404 Not Found,安装完成
本次使用nfs-subdir-external-provisioner来部署nfs动态存储,nfs-client-provisioner已经废弃不建议使用,安装方式大致相同,1.20及以上的kubernetes安装nfs-client-provisioner时注意在/etc/kubernetes/manifests/kube-apiserver.yaml文件中添加- --feature-gates=RemoveSelfLink=false参数
所有节点都执行
yum install -y nfs-utils
nfs服务器才执行
mkdir -p /data/nfs
192.168.0.0/24为集群网段 rw:以读写的方式共享 syn:默认选项,保持数据同步,数据同步写入到内存和硬盘 no_root_squash:NFS客户端连接服务端时如果使用的是root用户的话,那么对服务端分享的目录来说,也拥有root权限 no_all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有root权限
cat >> /etc/exports << EOF
/data/nfs 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash)
EOF
systemctl enable rpcbind.service
systemctl enable nfs-server.service
systemctl start rpcbind.service
systemctl start nfs-server.service
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm search repo nfs-subdir-external-provisioner --versions
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.14
tar -xzvf nfs-subdir-external-provisioner-4.0.14.tgz
vi nfs-subdir-external-provisioner/values.yaml
replicaCount: 3 # 第1行,副本个数,根据自身需求设置,建议3个
image:
repository: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner # 第5行,设置镜像仓库
tag: v4.0.2 # 第6行,镜像版本
nfs:
server: 192.168.0.66 # 第11行,nfs server端地址
path: /data/nfs # 第12行,nfs目录
storageClass:
defaultClass: true # 第27行,设置为默认存储类,如果不设置,使用存储类时需要指定
name: nfs-storage # 第31行,设置存储类资源名称
kubectl create namespace nfs-storage
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner -n nfs-storage
kubectl get pod -n nfs-storage
cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: default #这儿不指定命名空间会指向到nfs-storage的命名空间去
spec:
storageClassName: nfs-storage # 指定存储类,如果设置了默认,可以去掉
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
#一键创建
cat > status-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: status-pvc
namespace: default
spec:
storageClassName: nfs-storage # 指定存储类,如果设置了默认,可以去掉
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f .yaml
kubectl get pvc,pv -n nfs-storage
kubectl apply -f test-pvc.yaml -n nfs-storage
kubectl get pvc,pv -n nfs-storage
解压出来的文件夹,不建议删除,可用于恢复和更改服务
rm -rf nfs-subdir-external-provisioner-4.0.14.tgz
kubectl delete -f test-pvc.yaml -n nfs-storage
rm -rf test-pvc.yaml
cd /data/nfs/
证书格式为PEM格式,版本为v3
cat > openssl.cnf << EOF
# ca根证书配置
[ ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
# HTTPS应用证书配置
[ crt ]
subjectKeyIdentifier = hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:false
keyUsage = critical, digitalSignature, cRLSign, keyEncipherment
extendedKeyUsage = critical, serverAuth, clientAuth
subjectAltName=@alt_names
# SANs可以将一个证书给多个域名或IP使用
# 访问的域名或IP必须包含在此,否则无效
# 修改为你要保护的域名或者IP地址,支持通配符
[alt_names]
DNS.1 = *.anson.cn
IP.1 = 192.168.0.66
IP.2 = 192.168.0.67
IP.3 = 192.168.0.68
EOF
openssl genrsa -out root.key 2048
C:所在国家 (Country),只能是两位字母缩写 ST:所在省份(State) L:所在城市(Locality) O:所在组织(Organization) OU:所在部门(Organization Unit) CN:公用名,即域名(Common Name)
openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=anson/OU=anson/CN=*.anson.cn"
-req: 证书请求 -extfile:扩展文件配置和-extensions参数使用 -extensions:扩展配置 -in:证书请求文件 -out:证书输出文件 -signkey:签名的私钥 -days:有效期
openssl x509 -req -extfile openssl.cnf -extensions ca -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 36500
pem证书转pfx证书分两种,一种带ca证书转换,一种不带ca证书转换
1.pem转pfx(不带ca证书)
以test.pem转test.pfx为例
openssl rsa -in test.pem -out test.key
openssl x509 -in test.pem -out test.crt
openssl pkcs12 -export -out test.pfx -inkey test.key -in test.crt
2.pem转pfx(带ca证书)
以test.pem和ca.crt(ca.pem)转 test_ca.pfx为例
openssl rsa -in test.pem -out test.key
openssl x509 -in test.pem -out test.crt
openssl pkcs12 -export -out test_ca.pfx -inkey test.key -in test.crt -CAfile ca.crt
如果ca证书为pem格式
openssl pkcs12 -export -out test_ca.pfx -inkey test.key -in test.crt -CAfile ca.pem
openssl pkcs12 -export -out client-ca.pfx -inkey client-key.pem -in client-cert.pem -CAfile cacert.pem
openssl pkcs12 -export -out client.pfx -inkey client-key.pem -in client-cert.pem
ps(个人用):
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
openssl pkcs12 -export -out client-ca.pfx -inkey client.key -in client.crt -CAfile ca.crt
openssl genrsa -out test.key 2048
openssl req -new -key test.key -out test.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=anson/OU=test/CN=test.anson.cn"
test.csr为证书序列号文件
openssl x509 -req -extfile openssl.cnf -extensions crt -CA root.crt -CAkey root.key -CAserial test.srl -CAcreateserial -in test.csr -out test.crt -days 36500
#添加证书到k8s中
kubectl create secret tls tls-test --cert=test.crt --key=test.key -n default
#创建域名访问
cat > ingress-test.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
creationTimestamp: null
name: test-nginx
namespace: default
spec:
ingressClassName: nginx
rules:
- host: test.anson.cn
http:
paths:
- backend:
service:
name: web
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- test.anson.cn
secretName: tls-test
status:
loadBalancer: {}
EOF
kubectl apply -f ingress-test.yaml
温馨提示:不要轻易信任一个根证书!
下载根证书root.crt到windows,双击证书
点击安装证书
选择本地计算机,点击下一页
可以根据需求自行选择,推荐手动选择受信任的根证书颁发机构
点击完成,浏览器访问测试
# 将受信任的根证书下载到 /etc/pki/ca-trust/source/anchors/ 目录
cp root.crt /etc/pki/ca-trust/source/anchors/root.crt
# 更新受信任的根证书
update-ca-trust
root.key和root.crt建议保留,以后签发证书都可以用它,不用在重复信任根证书了,gitlab.key和gitlab.crt也建议保留
rm -rf root.csr test.csr
helm repo add harbor https://helm.goharbor.io
helm search repo harbor/harbor --versions
helm pull harbor/harbor --version 1.8.0
tar -xzvf harbor-1.8.0.tgz
kubectl create namespace harbor
#添加harbor证书
openssl genrsa -out harbor.key 2048
openssl req -new -key harbor.key -out harbor.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=anson/OU=harbor/CN=harbor.anson.cn"
openssl x509 -req -extfile openssl.cnf -extensions crt -CA root.crt -CAkey root.key -CAserial harbor.srl -CAcreateserial -in harbor.csr -out harbor.crt -days 36500
kubectl create secret tls tls-harbor --cert=harbor.crt --key=harbor.key -n harbor
#添加harbor-notary证书
openssl genrsa -out harbor-notary.key 2048
openssl req -new -key harbor-notary.key -out harbor-notary.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=anson/OU=harbor-notary/CN=harbor-notary.anson.cn"
openssl x509 -req -extfile openssl.cnf -extensions crt -CA root.crt -CAkey root.key -CAserial harbor-notary.srl -CAcreateserial -in harbor-notary.csr -out harbor-notary.crt -days 36500
kubectl create secret tls tls-harbor-notary --cert=harbor-notary.crt --key=harbor-notary.key -n harbor
vi harbor/values.yaml
可以默认参数,但是如果用自己的域名就需要修改了,生成自签证书,具体步骤请参考Openssl生成自签证书,注意SANs要包含harbor.anson.cn和harbor-notary.anson.cn这两个域名,最后需要2个文件,应用证书harbor.crt和应用私钥harbor.key
expose:
tls:
certSource: secret # 第21行,使用自签证书
secret:
secretName: "tls-harbor" # 第30行,harbor证书secret
notarySecretName: "tls-harbor-notary" # 第25行,notary证书secret
ingress:
hosts:
core: harbor.anson.cn # 第38行,harbor域名
notary: harbor-notary.anson.cn # 第39行,notary域名,用于镜像的签名,保证镜像安全,不能与core设置的域名一样
annotations:
kubernetes.io/ingress.class: "nginx" # 第50行,添加注解,设置ingress控制器,如果设置了默认ingress控制器,可以不加
externalURL: https://harbor.anson.cn # 第123行,harbor访问URL,跟第38行域名保持一致
persistence:
persistentVolumeClaim:
registry: # 镜像存储
storageClass: "nfs-storage" # 第216行,nfs存储类名,如果设置了默认存储类,可以不填
size: 10Gi # 第219行,根据自身需求设置存储大小,建议500Gi
chartmuseum: # chart存储
storageClass: "nfs-storage" # 第222行
size: 5Gi # 第225行,根据自身需求设置存储大小
jobservice: # 定时任务
storageClass: "nfs-storage" # 第228行
size: 1Gi # 第231行
database:
storageClass: "nfs-storage" # 第236行
size: 1Gi # 第239行
redis:
storageClass: "nfs-storage" # 第244行
size: 1Gi # 第247行
trivy: # 镜像漏扫
storageClass: "nfs-storage" # 第250行
size: 5Gi # 第253行
helm install harbor harbor -n harbor
kubectl get pod -n harbor
windows设置hosts,修改C:\Windows\System32\drivers\etc\hosts文件,添加如下配置
192.168.0.66为master节点的IP地址,ingress-nginx-controller控制器在master上,请自行修改为相应IP地址。如果修改不了,需要修改hosts文件的权限,或者新建一个文本文件重命名为hosts
192.168.0.66 harbor.anson.cn
默认、用户名为admin 密码为Harbor12345。 https://harbor.anson.cn
cat >> /etc/hosts << EOF
192.168.0.66 harbor.anson.cn
EOF
cp root.crt /etc/pki/ca-trust/source/anchors/root.crt
update-ca-trust
systemctl restart docker
vi /etc/docker/daemon.json
{
"insecure-registries": ["harbor.anson.cn"]
}
systemctl reload docker
docker login harbor.anson.cn
docker login harbor.anson.cn -u admin -p Harbor12345
docker pull nginx:latest
docker tag nginx:latest harbor.anson.cn/test/nginx:latest
docker push harbor.anson.cn/test/nginx:latest
docker rmi nginx:latest
docker rmi harbor.anson.cn/test/nginx:latest
docker pull harbor.anson.cn/test/nginx:latest
docker rmi harbor.anson.cn/test/nginx:latest
解压出来的文件夹,不建议删除,可用于恢复和更改服务
rm -rf harbor-1.8.0.tgz
helm repo add gitlab https://charts.gitlab.io/
helm search repo gitlab/gitlab --versions
helm pull gitlab/gitlab --version 5.5.2
tar -xzvf gitlab-5.5.2.tgz
kubectl create namespace gitlab
#生成应用私钥core
openssl genrsa -out gitlab.key 2048
#生成域名证书请求文件
openssl req -new -key gitlab.key -out gitlab.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=anson/OU=gitlab/CN=gitlab.anson.cn"
#签发证书
openssl x509 -req -extfile openssl.cnf -extensions crt -CA root.crt -CAkey root.key -CAserial gitlab.srl -CAcreateserial -in gitlab.csr -out gitlab.crt -days 36500
#添加证书到k8s中
kubectl create secret tls tls-gitlab --cert=gitlab.crt --key=gitlab.key -n gitlab
vi gitlab/values.yaml
生成自签证书,具体步骤请参考Openssl生成自签证书,注意SANs要包含gitlab.anson.cn和minio.anson.cn、registry.anson.cn这三个域名,最后需要2个文件,应用证书gitlab.crt和应用私钥gitlab.key
global:
edition: ce # 第45行,修改为ce为社区版,默认ee为企业版
hosts:
domain: anson.cn # 第57行,gitlab主域名,会自动使用gitlab.anson.cn,minio.anson.cn,registry.anson.cn,也可以单独设置相应的name和https字段,参考https://docs.gitlab.cn/charts/charts/globals.html
ingress:
configureCertmanager: false # 第73行,不使用Certmanager
annotations:
kubernetes.io/ingress.class: nginx # 第76行,添加注解,设置ingress控制器,如果设置了默认ingress控制器,可以不加
tls:
enabled: true # 第79行,取消注释,设置tls
secretName: "tls-gitlab" # 第80行,取消注释,设置tls的secretName
certmanager:
install: false # 第721行,不安装certmanager管理证书
nginx-ingress:
enabled: false # 第731行,已经有ingress-nginx了不需要再安装
gitlab-runner:
install: false # 第988行,不安装gitlab-runner,使用jenkins构建服务,如果有需要,自行开启
#其他设置
gitlab/values.yaml中取消sidekiq安装
#文件中资源2.5G调整,不需要这么多 340行
gitlab/charts/gitlab/charts/webservice/values.yaml
helm install gitlab gitlab -n gitlab
kubectl get pod -n gitlab
192.168.0.66为master节点的IP地址,ingress-nginx-controller控制器在master上,请自行修改为相应IP地址。如果修改不了,需要修改hosts文件的权限,或者新建一个文本文件重命名为hosts
192.168.0.66 gitlab.anson.cn
https://gitlab.anson.cn
minio,redis,portgresql等密码都在相应的secret中
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo
#root密码
UsM0UJ4qcHh4W1HQnJ9WThHMmfDquxU8xPNsI2eVmAW6IjeRJ46PNIJKazTyi1KW
hudingwen
#token令牌
HfGbHDaKPQcPy_hKXknx
#设置SSL证书不验证
git config --global http.sslbackend schannel
git config --global http.sslVerify false
#设置用户和邮箱
git config --global user.name "root"
git config --global user.email "admin@example.com"
#生成免登录SSH密钥 C:\Users\Administrator\.ssh
ssh-keygen -t rsa -C "admin@example.com"
#rsa转ppk 运行puttygen点击Conversions菜单项中的Import key 点击Save private key转成ppk
#拉取代码
#ssh方式拉取
git clone git@gitlab.anson.cn:root/test.git
#http方式拉取
git clone https://gitlab.anson.cn/root/test.git
#推送
git switch -c main
git add test.txt
git commit -m "this is a test"
git push -u origin main
全部推送
git switch -c main
git add .
git commit -m "delete test file"
git push origin main
#测试ssh
ssh -T git@gitlab.anson.cn
#测试是否正常
ssh -vT git@gitlab.anson.cn -p 32022
ssh-add C:\Users\Administrator\.ssh\id_rsa
git clone ssh://git@gitlab.anson.cn:32022/root/net.git
#随机Pod暴露端口
kubectl expose deployment gitlab-gitlab-shell -n gitlab --port=32022 --target-port=32022 --type=NodePort
#代理暴露端口
kubectl port-forward pod/gitlab-gitlab-shell-759f4bb668-dqdz9 -n gitlab 32022:32022
kubectl port-forward service/gitlab-gitlab-shell -n gitlab 32022:32022
kubectl edit svc/gitlab-gitlab-shell -n gitlab
kubectl edit svc/kube-prometheus-stack-prometheus -n kube-prometheus-stack
spec:
clusterIP: 10.101.42.41
clusterIPs:
- 10.101.42.41
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: web
nodePort: 32022
port: 9090
protocol: TCP
targetPort: 9090
selector:
app.kubernetes.io/name: prometheus
prometheus: kube-prometheus-stack-prometheus
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
如果不设置会报错:SSL certificate problem: unable to get local issuer certificate
git config --global http.sslbackend schannel
git clone https://gitlab.anson.cn/gitlab-instance-98897215/Monitoring.git
git add README.md
git commit -m 添加README.md文件测试
git push origin
本文分享自 NetCore 从壹开始 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有