工作随笔 - 纯离线使用minikube创建k8s集群

收到一个需求,快速地在一个完全不通外网的服务器利用minikube安装单机版本k8s,由于服务器无外网,还是遇到了很多曲折,特此总结一下,以备自己和他人参考。

  1. 配置离线yum源,离线安装docker-ce,此处安装的版本为19.03.9,离线yum源步骤参考https://www.jianshu.com/p/821ac391b7a9
# 安装docker-ce
yum install -y docker-ce
# 创建docker的镜像存放目录,以防默认磁盘空间不够用
mkdir /home/finance/docker_home 
# 修改默认docker根目录
mkdir /etc/docker
echo '{
  "data-root": "/home/finance/docker_home"
}' > /etc/docker/daemon.json
#给某用户添加docke权限
usermod -aG docker finance
# 启动docker-ce并设置自启动
systemctl enable --now docker
docker info
  1. 关闭系统交换区
swapoff -a
  1. 安装docker-compose
# 下载 docker-compose-Linux-x86_64
# 上传到/usr/local/bin
[root@ai-server-test-01 bin]# ls -ltr
total 10608
-rw-r--r-- 1 root root 10858808 Nov 12 10:09 docker-compose-Linux-x86_64
[root@ai-server-test-01 bin]# pwd
/usr/local/bin
# 重命名并修改权限
cp docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
# 版本如下
[root@ai-server-test-01 bin]# docker-compose version
docker-compose version 1.21.2, build a133471
docker-py version: 3.3.0
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
  1. 安装harbor,参考 https://www.jianshu.com/p/f7eb62b31380,并把k8s需要的镜像上传到harbor
  2. docker登陆harbor,以便后续upload
docker login -u admin -p <password>  harbor.ai.com
# 需要的k8s镜像如下
storage-provisioner       v1.8.1     
kube-proxy                v1.18.3
kube-apiserver            v1.18.3
kube-scheduler            v1.18.3
kube-controller-manager   v1.18.3
pause                     3.2    
coredns                   1.6.7  
etcd                      3.4.3-0
  1. 安装minikube
# 上传到服务器,并更改权限,重命名
chmod +x minikube-linux-x86_64
cp minikube-linux-x86_64 /usr/local/bin/minikube
# 版本如下
[root@ai-server-test-01 bin]# minikube version
minikube version: v1.11.0
commit: 57e2f55f47effe9ce396cea42a1e0eb4f611ebbd
  1. 安装,并启动单节点k8s v1.18.3
# 安装conntrack 
yum install conntrack -y
# 由于是纯离线,无法从网上拉取k8s的包,所以需要手动创建好以下目录 (选做,如果找不到kubectl的的时候)
mkdir -p /root/.minikube/cache/linux/v1.18.3
# 上传已经下载好的对应版本执行文件 (选做,如果找不到kubectl的的时候)
kubeadm  kubectl  kubelet
# 把提前下载好的kubeadm  kubectl  kubelet放置到/usr/local/bin并加执行权限
kubeadm  
kubectl  
kubelet
#版本如下
[root@ai-server-test-01 bin]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:52:00Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:43:34Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

#启动minikube
# --vm-driver=none,本来就是虚拟机,无需再虚拟一个。
minikube start --kubernetes-version v1.18.3 --vm-driver=none  --image-repository=harbor.ai.com/kube --insecure-registry=harbor.ai.com
minikube status
minikube logs

# 运行结果参考以下
[root@ai-server-test-01 software]# minikube start --kubernetes-version v1.18.3 --vm-driver=none  --image-repository=harbor.ai.com/kube --insecure-registry=harbor.ai.com
* minikube v1.11.0 on Centos 7.6.1810
* Using the none driver based on existing profile
* Starting control plane node minikube in cluster minikube
* Restarting existing none bare metal machine for "minikube" ...
* OS release is CentOS Linux 7 (Core)
* Preparing Kubernetes v1.18.3 on Docker 19.03.9 ...
* Configuring local host environment ...
*
! The 'none' driver is designed for experts who need to integrate with an existing VM
* Most users should use the newer 'docker' driver instead, which does not require root!
* For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/
*
! kubectl and minikube configuration will be stored in /root
! To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:
*
  - sudo mv /root/.kube /root/.minikube $HOME
  - sudo chown -R $USER $HOME/.kube $HOME/.minikube
*
* This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* Done! kubectl is now configured to use "minikube"
* For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
[root@ai-server-test-01 software]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

# 确保所有pods都启动正常
[root@ai-server-test-01 software]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                        READY   STATUS    RESTARTS   AGE
default       nginx-app-684bd4f4c-mkvdm                   1/1     Running   0          45m
default       nginx-app-684bd4f4c-wnrfn                   1/1     Running   0          45m
kube-system   coredns-6bb6b45975-dbqbw                    1/1     Running   1          88m
kube-system   coredns-6bb6b45975-lv4c8                    1/1     Running   1          88m
kube-system   etcd-ai-server-test-01                      1/1     Running   1          88m
kube-system   kube-apiserver-ai-server-test-01            1/1     Running   1          88m
kube-system   kube-controller-manager-ai-server-test-01   1/1     Running   1          88m
kube-system   kube-proxy-7hmvj                            1/1     Running   1          88m
kube-system   kube-scheduler-ai-server-test-01            1/1     Running   1          88m
kube-system   storage-provisioner                         1/1     Running   0          88m

  1. 测试k8s集群
# 需要保证nginx镜像已经在minikube设置的仓库中
# 创建deployment的配置文件
# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
  # Kind 的名称
  name: nginx-app
spec:
  selector:
    matchLabels:
      # 容器标签的名字,发布 Service 时,selector 需要和这里对应
      app: nginx
  # 部署的实例数量
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 配置容器,数组类型,说明可以配置多个容器
      containers:
      # 容器名称
      - name: nginx
        # 容器镜像
        image: nginx:latest
        # 只有镜像不存在时,才会进行镜像拉取
        imagePullPolicy: IfNotPresent
        ports:
        # Pod 端口
        - containerPort: 80
# 执行命令,创建deployment
kubectl apply -f nginx.yml
# 查看pods
[root@ai-server-test-01 software]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nginx-app-684bd4f4c-mkvdm   1/1     Running   0          4s
nginx-app-684bd4f4c-wnrfn   1/1     Running   0          4s
# 使用expose命令将pod暴露到外部环境
[root@ai-server-test-01 software]# kubectl expose deployment nginx-app --type=LoadBalancer
service/nginx-app exposed
# 查看刚创建的services
[root@ai-server-test-01 software]# kubectl get services
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1     <none>        443/TCP        51m
nginx-app    LoadBalancer   10.103.29.3   <pending>     80:32457/TCP   5m27s
# 通过--type=LoadBalancer来将service暴露到集群外,在支持负载的云平台,将配置外部IP地址来访问service,此处显示为<pending>,在minikube上,可以使用minikube service来查看

[root@ai-server-test-01 software]# minikube service nginx-app
|-----------|-----------|-------------|----------------------------|
| NAMESPACE |   NAME    | TARGET PORT |            URL             |
|-----------|-----------|-------------|----------------------------|
| default   | nginx-app |          80 | http://10.193.199.91:32457 |
|-----------|-----------|-------------|----------------------------|
* Opening service default/nginx-app in default browser...
xdg-open: no method available for opening 'http://10.193.199.91:32457'
*
X open url failed: http://10.193.199.91:32457: exit status 3
*
* minikube is exiting due to an error. If the above message is not useful, open an issue:
  - https://github.com/kubernetes/minikube/issues/new/choose
#可以curl一下,看看nginx是否启动
[root@ai-server-test-01 software]# curl http://10.193.199.91:32457
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 测试nginx运行正常
  1. minikube命令
minikube stop
minikube service
minikube help
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容