本方案的最终效果: 在本地minikube中有一个完整的arkid环境,vscode容器化开发环境,无需本地安装python和依赖。 一键在容器中进行开发调试,一个命令部署更新代码到minikube中。

一、配置和程序要求

  • 电脑配置:
    本教程针对的是mac,其他系统稍作修改就能使用。
    内存 16g+
  • 需要的程序:

    VirtualBox
    vscode
    minikube
    skaffold
    kubectl
    helm
    docker

二、程序安装:

  1. # 1、VirtualBox 和 vscode 的安装就不再赘述了。
  2. # 2、minikube 安装
  3. # 2.0、下载minikube
  4. curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.16.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
  5. # 2.1、首次安装
  6. minikube start \
  7. --profile='arkid' \
  8. --driver='virtualbox' \
  9. --image-mirror-country cn \
  10. --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.16.0.iso \
  11. --registry-mirror=https://gug8awv5.mirror.aliyuncs.com \
  12. --cpus=2 \
  13. --memory=6096 \
  14. --kubernetes-version=1.18.15 \
  15. --insecure-registry=192.168.0.0/12 \
  16. --docker-opt dns=10.96.0.10 \
  17. --addons ingress
  18. # 2.2、基本操作
  19. minikube -p arkid status
  20. minikube -p arkid stop
  21. minikube -p arkid start
  22. minikube -p arkid delete # 删除慎用啊
  23. minikube -p arkid addons list
  24. minikube -p arkid addons enable ingress
  25. minikube -p arkid ssh
  26. # 2.3、配置dockerd
  27. # 查看
  28. minikube -p arkid docker-env
  29. # 配置docker后端为arkid minikube的dockerd
  30. echo "eval \$(minikube -p arkid docker-env)" >> ~/.zshrc
  31. source ~/.zshrc
  32. # 3、skaffold 安装
  33. curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-darwin-amd64 && \
  34. sudo install skaffold /usr/local/bin/
  35. # 4、kubectl 安装
  36. curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.15/bin/darwin/amd64/kubectl
  37. chmod +x ./kubectl
  38. sudo mv ./kubectl /usr/local/bin/kubectl
  39. kubectl get nodes
  40. # 5、helm 命令安装
  41. brew install helm
  42. 其他安装方式请看官方文档:
  43. https://helm.sh/docs/intro/install/
  44. # 6、docker 客户端命令安装
  45. 可以安装"docker desktop for mac",只用docker客户端命令,不用启动。
  46. https://hub.docker.com/editions/community/docker-ce-desktop-mac/
  47. docker ps

三、arkid helm部署到minikube

  1. git clone https://github.com/longguikeji/arkid-charts.git
  2. cd arkid-charts/chart
  3. helm install arkid . --set persistence.init=true --set ingress.cert=false --set ingress.tls=false --set apiServer=""
  4. # 暴露到本地端口
  5. kubectl port-forward --address 0.0.0.0 deployment/arkid-portal 8081:80
  6. # 访问,管理员账号密码 admin / admin
  7. http://127.0.0.1:8081

四、克隆arkid后端工程

  1. git clone https://github.com/longguikeji/arkid.git

五、vscode开发arkid项目

vscode需要安装插件 Remote-Containers

1、点击Remote-Containers: Reopen in Container
如果报错,把vscode完全退出,再打开arkid项目
image.png

2、点击details 查看进度,首次下载会比较慢
image.png

3、出现如下图片,说明环境都启动好了,在容器中所有的依赖都安装好了
image.png

4、arkid根目录下添加本地配置文件 settings_local.py

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'arkid',
  5. 'USER': 'root',
  6. 'PASSWORD': 'root',
  7. 'HOST': 'arkid.default.svc.cluster.local',
  8. 'PORT': '3306',
  9. 'OPTIONS': {
  10. 'autocommit': True,
  11. 'init_command': 'SET default_storage_engine=InnoDB',
  12. 'charset': 'utf8mb4',
  13. },
  14. }
  15. }
  16. REDIS_CONFIG = {
  17. 'HOST': 'arkid.default.svc.cluster.local',
  18. 'PORT': 6379,
  19. 'DB': 0,
  20. 'PASSWORD': None,
  21. }
  22. REDIS_URL = 'redis://{}:{}/{}'.format(REDIS_CONFIG['HOST'], REDIS_CONFIG['PORT'], REDIS_CONFIG['DB']) if REDIS_CONFIG['PASSWORD'] is None \
  23. else 'redis://:{}@{}:{}/{}'.format(REDIS_CONFIG['PASSWORD'], REDIS_CONFIG['HOST'], REDIS_CONFIG['PORT'], REDIS_CONFIG['DB'])
  24. CACHES = {
  25. "default": {
  26. "BACKEND": "django_redis.cache.RedisCache",
  27. "LOCATION": REDIS_URL,
  28. "TIMEOUT": 60 * 60 * 24 * 3,
  29. "OPTIONS": {
  30. "MAX_ENTRIES": None,
  31. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  32. }
  33. }
  34. }
  35. CELERY_BROKER_URL = REDIS_URL
  36. INSTALLED_APPS += ['ldap.sql_backend']
  37. # 最终对外暴露的 web server 地址
  38. BASE_URL = 'http://arkid-portal'
  39. import datetime
  40. SMS_LIFESPAN = datetime.timedelta(seconds=600)
  41. EXPIRING_TOKEN_LIFESPAN = datetime.timedelta(days=365 * 10)
  42. REST_FRAMEWORK = {
  43. 'DEFAULT_AUTHENTICATION_CLASSES': (
  44. # 'oneid.authentication.CustomExpiringTokenAuthentication',
  45. 'oneid.authentication.SUDOExpiringTokenAuthentication',
  46. 'oneid.authentication.HeaderArkerBaseAuthentication',
  47. ),
  48. 'DEFAULT_PERMISSION_CLASSES': (
  49. 'rest_framework.permissions.IsAuthenticated',
  50. 'oneid.permissions.IsAdminUser',
  51. )
  52. }

5、生成debug配置并启动
image.png

6、启动之后,把端口暴露到笔记本端口,就可以在本地对接口进行测试了
image.png
image.png
image.png

六、skaffold自动部署到minikube中测试

当前vscode内的终端都是在容器中,需要打开一个外部的终端,进入到arkid目录,执行 skaffold run。
还有另外一个命令可以监控文件变化自动更新,skaffold dev,skaffold文档:https://skaffold.dev/docs/quickstart/
image.png

更新成功之后访问,管理员账号密码 admin / admin
http://127.0.0.1:8081