记录一次真实迁移经历

  |   0 评论   |   886 浏览

迁移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的时候,不需要编译的就这样。需要编译的要稍微复杂点。另外就是每做一步就要测试验证一步,以免最后出现问题导致思路混乱找不到下手点来排除故障。

最后:保留好步骤二里的Dockerfilehtml目录,假如后期对代码进行更改(增加/删除/更改)只需编辑源代码文件后重新build打一个新的TAGpush到你的仓库中去。kubernetes这边直接使用如下命令进行替换镜像即可:

# 假设新TAG是v2

kubectl set image deploy nginx nginx=nginx:v2

# 解析:更改名为nginx的deployment控制器内名为nginx的container的镜像为nginx:v2
公告滚动栏

你只有不断努力,才能看起来毫不费力!

by Happiness

评论

发表评论