一、实验环境搭建
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.yaml和fission-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环境啦!