记录一次真实迁移经历
2020-03-08 本文已影响0人
H_appiness
迁移GitHub Pages到k8s
背景:我的个人导航网站https://www.k8s.fit/
原来是在GitHub Pages
上的,由于在国内访问GitHub Pages
速度真的感人,从而产生了一个想法:把GitHub Pages
迁移到k8s内,这样不仅解决了访问速度慢的问题,也间接的锻炼一下自己对k8s的实际操作能力!
废话不多说,直接上操作的过程!
整体思路:
- 基于nginx镜像把代码打包进去即可
- docker环境下跑通然后上kubernetes
- 使用cert-manager自动签发证书
步骤一
把github上源码克隆到本地并重命名
git clone https://github.com/xxx/xxx.git
mv xxx.git html
步骤二 - 编写dockerfile
vim Dockerfile
FROM nginx:1.9.1
MAINTAINER Happiness-lijian
COPY ./html /usr/share/nginx/html
# 解析:基于nginx:1.9.1镜像(基础镜像一定要固定版本!!!) 拷贝当前目录下的html目录到nginx镜像的默认目录/usr/share/nginx/html
# 接下来构建镜像,确保当前上下文目录下只有html目录和Dockerfile,避免把无用的东西构建到镜像中去,形成臃肿的镜像
docker build -t xxx/nginx:v1 .
步骤三 - 测试镜像
步骤二完成后,执行如下命令来测试镜像是否可用
docker run -dit --name nginx -p 3800:80 xxx/nginx:v1
# 解析:运行xxx/nginx:v1名为nginx的镜像,暴露出3800端口到物理机
# 验证:局域网内机器访问 物理机IP:3800查看是否成功
## 运行成功的镜像push到你的仓库中
步骤四 - 使用kubernetes运行该镜像
vim daohang.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: daohang
name: daohang
namespace: daohang
spec:
replicas: 1
selector:
matchLabels:
app: daohang
template:
metadata:
labels:
app: daohang
spec:
containers:
- image: xxx/nginx:v1
name: daohang
resources:
limits:
cpu: 2000m
memory: 1Gi
requests:
cpu: 1000m
memory: 1000Mi
nodeName: k8s-node2
---
apiVersion: v1
kind: Service
metadata:
name: daohang-svc
namespace: daohang
labels:
app: daohang
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30800
selector:
app: daohang
# 解析:如上:我这里使用Deployment控制器来运行该镜像,并指定了其运行的节点
# 部署该文件
kubectl apply -f daohang.yaml
步骤五 - 测试是否生效
# 查看其是否正常运行
kubectl get pod,svc -n daohang
NAME READY STATUS RESTARTS AGE
pod/daohang-68fd898975-svj2r 1/1 Running 0 102m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/daohang-svc NodePort 10.244.78.194 <none> 80:30800/TCP 102m
# 验证:局域网内机器访问 nodeIP:30800查看是否成功
步骤六 - 使用cert-manager自动签发证书
vim ingress-daohang.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: daohang-ingress
namespace: daohang
annotations:
kubernietes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- www.k8s.fit
secretName: daohang-tls
rules:
- host: www.k8s.fit
http:
paths:
- path: /
backend:
serviceName: daohang-svc
servicePort: 80
---
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: 15110264730@163.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: daohang
namespace: daohang
spec:
secretName: daohang-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
duration: 2160h
renewBefore: 360h
keyEncoding: pkcs1
dnsNames:
- www.k8s.fit
# 部署该文件
kubectl apply -f ingress-daohang.yaml
关于cert-manager
查看上篇文章 Kubernetes安装cert-manager(二)
关于cert-manager
查看上篇文章 Kubernetes安装cert-manager(一)
总结:
基本上所有的操作步骤和注意事项都已经写在上面了,整体来说,迁移过程不是特别费事,稍微重要的一点就是在编写Dockerfile
的时候,不需要编译的就这样。需要编译的要稍微复杂点。另外就是每做一步就要测试验证一步,以免最后出现问题导致思路混乱找不到下手点来排除故障。
最后:保留好
步骤二
里的Dockerfile
和html目录
,假如后期对代码进行更改(增加/删除/更改)只需编辑源代码文件后重新build打一个新的TAG
并push
到你的仓库中去。kubernetes这边直接使用如下命令进行替换镜像即可:
# 假设新TAG是v2
kubectl set image deploy nginx nginx=nginx:v2
# 解析:更改名为nginx的deployment控制器内名为nginx的container的镜像为nginx:v2