Docker-18.09+K8s-1.19+Fission-1.10部署(Serverless)

一、实验环境搭建

1.实验设备

集群三台虚拟机(Ubuntu 16.04):

master:K8S的master节点

node1:K8S的node1节点

node2:K8S的node2节点

额外一台虚拟机(Ubuntu 20.04)://如果之后不对故障进行测试,不需要这个虚拟机

test:故障注入和负载模拟节点

虚拟机16.04下载地址:Index of /ubuntu-releases/16.04/

虚拟机20.04下载地址:Index of /ubuntu-releases/20.04/

安装教程参考:http://t.csdnimg.cn/a10Qm

2.环境配置

虚拟机tools安装(master、node、test)

比如:

sudo apt install open-vm-tools

sudo apt install open-vm-tools-desktop

reboot

等vamre工具,自行配置

安装go(master、node):

wget https://golang.org/dl/go1.18.10.linux-amd64.tar.gz

tar xzvf go1.18.10.linux-amd64.tar.gz

export PATH=/home/master/Document/go/bin:$PATH

go version验证一下

静态IP配置(master、node):

vim /etc/network/interfaces

添加:

    auto ens33     iface ens33 inet static     address 192.168.1.233     netmask 255.255.255.0     gateway 192.168.31.1 //按你自己的实际情况配置

vim /etc/resolvconf/resolv.conf.d/base

里面是空的,要写:

nameserver 8.8.8.8 nameserver 114.114.114.114 nameserver 8.8.4.4

执行:#resolvconf -u

重启网络:$ sudo /etc/init.d/networking restart (遇事不决可以重启虚拟机

参考:Ubuntu 16.04设置静态IP地址_ubuntu1604配置静态ip-CSDN博客

科学上网(master、node、test)

网上教程多的是,自行选择

二、Docker-18.09安装

(master、node)

sudo apt-get update //更新本地软件包列表

sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common //安装一些工具,确保系统能够通过https下载安装软件

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - //从docker官方下载GPG公钥,确保正常安装docker软件包

sudo add-apt-repository \ "deb [arch=amd64] Index of linux/ubuntu/ \ $(lsb_release -cs) \ stable" //添加docker官方仓库的软件源,并指定软件源,只提供适用于当前ubuntu版本且是稳定版本的软件包

apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 18.09 | head -1 | awk '{print $3}') //更新软件包,安装特定版本dockerce

//sudo docker run hello-world 测试一下docker是否安装成功(docker info输出docker信息,注意和K8S的兼容性)

问题:

(1)此时已经安装好docker,使用命令 docker info ,如果能正常返回结果,但是最后两行是:

WARNING: No memory limit support

WARNING: No swap limit support

解决:sudo vim /etc/default/grub

# 将GRUB_CMDLINE_LINUX修改为

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

# 退出

sudo update-grub

# 重启

三、K8s-1.19安装

1.kubeadm、kubectl、kubelet安装(master、node)

sudo apt-get update && apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF //设置K8S的apt仓库,安装必要软件包和工具

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071 //添加GPG密钥

apt-get update && apt-get install -y kubelet=1.19.0-00 kubeadm=1.19.0-00 kubectl=1.19.0-00 //安装k8s组件

sudo swapoff -a

2.集群初始化(master)

kubeadm init --kubernetes-version stable-1.19 --pod-network-cidr=10.244.0.0/16 (记住kubeadm join XXXXX)

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes验证初始化情况

问题:

(1)[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".

解决:

在/etc/docker下创建daemon.json并编辑:

mkdir /etc/docker/daemon.json

加入以下内容:

{
 "exec-opts":["native.cgroupdriver=systemd"]
}

重启docker:

systemctl restart docker systemctl status docker

(2)初始化后,master节点notready,并且coredns pending状态

解决:因为没有网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

部署flannel等一会就好了

3.节点加入集群(node)

运行刚才保存的kubeadm join XXXXX加入集群

在master节点执行kubectl get node看是否加入成功(可能等一会才会ready)

问题:

(1)虚拟机重启后发现节点变成NotReady:

解决:根据自己情况,我是因为交换区sudo journalctl -f -u kubelet(failed to run Kubelet: running with swap on is not supported, pleaset --fail-swap-on flag to false)

#关闭Swap sudo swapoff -a sudo sed -i 's/.swap./#&/' /etc/fstab

#重启配置,重启docker,重启kubelet

sudo systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet.service

参考:https://www.cnblogs.com/haoprogrammer/p/10517306.html

(2)虚拟机挂起之后,再恢复发现coredns running 0/1

systemctl restart containerd

四、Fission-1.10安装

建议不使用helm,因为1.10版本太老了,现在helm的用法包括fission-chart仓库已经改了很多很难找到完整的部署教程,而且这样改yaml文件方便些。

1.部署Fission-all(master)

https://github.com/fission/fission/releases/从这里下载对应版本的部署yaml文件

这里需要下载fission-all-1.10.0.yamlfission-cli-linux(下一步用到)

仓库里还有fission-core-1.10.0.yaml版本,这个就是只包括fission的核心组件,如果简单使用,用这个就可以。

下面部署fission:

export FISSION_NAMESPACE="fission" kubectl create namespace $FISSION_NAMESPACE //为fission部署创建名字空间

kubectl config set-context --current --namespace=$FISSION_NAMESPACE

kubectl apply -f fission-all-1.10.0.yaml (镜像改成index.docker.io/cloudfaas/fission-bundle:1.10.0,如果对外暴露服务,Service的type记得改成Nodeport)

问题:

(1)一些pod处于pending状态,并且报错:no persistent volumes available for this claim and no storage class is set或者0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims.

解决:pvc没有与pv绑定,不信你使用kubectl get pvc看看是不是pending状态

编写pv.yaml文件:

- apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
    hostPath:
        path: "/mnt/data"
    ————————————————
​
- 这样就可以跟对应的pvc进行绑定

(2)pod报错:err="open /queries.active: permission denied"

解决:原因是容器权限不够,只需要一个初始化容器赋予权限即可(参考下面):

spec:
  initContainers:
  - name: prometheus-data-permission-fix
    image: busybox
    command: ["/bin/chmod","-R","777", "/data"]
    volumeMounts:
    - name: prometheus-data
      mountPath: /data
  containers:
    - name: prometheus
      image: docker.io/prom/prometheus:v2.12.0
      volumeMounts:
      - mountPath: "/prometheus/data"
        name: prometheus-data
  volumes:
    - name: prometheus-data
      persistentVolumeClaim:
        claimName: prometheus-pvc

或者修改容器的安全上下文:

  securityContext:
    runAsUser: 0 
    runAsNonRoot: false
    runAsGroup: 65534
    fsGroup: 65534   

参考:https://github.com/prometheus/prometheus/issues/5976

2.Fission-CLI安装(master):

刚才下载的fission-cli-linux派上用场了

chmod +x fission-cli-linux && sudo mv fission-cli-linux /usr/local/bin/

验证:fission -h

fission -version显示server unknown,这个不影响正常使用,我怀疑可能是版本的问题。

3.Fission函数测试(master)

测试一:

编写 hello.js 示例代码 vim hello.js module.exports = async function(context) { return { status: 200, body: "Hello, world!\n" }; }

制作 nodejs 环境

fission env create --name nodejs --image fission/node-env:1.10.0 environment 'nodejs' created

创建 hello function

fission function create --name hello --env nodejs --code hello.js function 'hello' created

测试调用 hello function

fission function test --name hello 结果:Hello, world!

测试二:

fission httptrigger create --url /hello --function hello trigger '85b8bdec-a3a8-4502-8642-c7e1768c614b' created fission ht list NAME METHOD HOST URL INGRESS FUNCTION_NAME 85b8bdec-a3a8-4502-8642-c7e1768c614b GET /hello false hello

curl $FISSION_ROUTER/hello

结果:Hello world!

这里要提前赋值一些常量:

export FISSION_ROUTER_PORT=$(kubectl get svc -l "svc=router" -n fission -o jsonpath="{.items[0].spec.ports[0].nodePort}") export MASTER_IP=$(192.168.31.233) export FISSION_ROUTER=http://$MASTER_IP:$FISSION_ROUTER_PORT

以上功能测试正常即为部署成功。

大家可以使用Serverless环境啦!

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张丰麟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值