K8S + OpenFaas 部署

作者:frank 发表日期:2018-11-13 16:11:20 更新日期:2018-11-13 16:16:54 分类:猿文色

摘要

K8S + OpenFaas 部署

正文

第一步:安装前准备

配置 hosts,编辑 /etc/hosts

172.18.80.92 node1
172.18.80.93 node2

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

禁用 SELinux

编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:
SELINUX=disabled

关闭系统Swap

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。方法一,通过kubelet的启动参数–fail-swap-on=false更改这个限制。方法二,关闭系统的Swap。
修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。

第二步:安装 Docker CE https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository

需要安装 K8S 支持的 Docker 版本,k8s 1.12 最高支持支持 docker 18.06.0-ce

第一步:
yum install -y yum-utils device-mapper-persistent-data lvm2

第二步:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

第三步:
yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test

第四步:
yum install docker-ce-18.06.0.ce-3.el7

第五步:
systemctl enable docker
systemctl start docker

备注:
卸载特定版本的 docker
yum remove docker docker-common docker-selinux docker-engine
yum remove -y docker-ce-cli-1:18.09.0-3.el7.x86_64
安装特定版本的 docker
yum install docker-ce-18.06.0.ce-3.el7

第三步:配置 Docker

开启iptables filter表的FORWARD链
编辑 /lib/systemd/system/docker.service,在 ExecStart=.. 上面加入如下内容:
ExecStartPost=/usr/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT

配置 Cgroup Driver 
创建文件 /etc/docker/daemon.json,添加如下内容:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

第四步:安装 K8S

配置路由表:
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

执行下面命令使配置生效:
sysctl --system
sysctl -p /etc/sysctl.d/k8s.conf

执行下面命令,配置软件源:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

执行下面的命令安装:
yum makecache fast
yum install -y kubelet kubeadm kubectl

配置开机启动
systemctl enable kubelet
systemctl start kubelet

第五步:初始化集群

执行命令
kubeadm init

配置普通用户使用 kubectl 访问集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装 Pod Network (只在 master 节点执行), 否则 coredns 没法运行
curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml > kube-flannel.yml
kubectl apply -f kube-flannel.yml

安装 flannel 的过程中可能会遇到 kube-flannel-ds-amd64 不断重启的情况, 
此时通过 kubectl -n kube-system logs kube-flannel-ds-amd64-css5m 查看日志,
如果发现 pod cidr not assgned, 则编辑 /etc/kubernetes/manifests/kube-controller-manager.yaml, 添加下面选项后重启
--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16

等到所有的 Pod 都成功 running
执行 kubectl get pod --all-namespaces
kube-system coredns-576cbf47c7-knjtr
kube-system coredns-576cbf47c7-zdjdn
kube-system etcd-localhost.localdomain
kube-system kube-apiserver-localhost.localdomain
kube-system kube-controller-manager-localhost.localdomain
kube-system kube-flannel-ds-amd64-css5m
kube-system kube-proxy-6psdb
kube-system kube-scheduler-localhost.localdomain

安装 k8s-dashboard
curl https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml > kubernetes-dashboard.yaml

编辑 kubernetes-dashboard.yaml 文件,在 Dashboard Service中 添加 type: NodePort,暴露 Dashboard 服务
kubectl create -f kubernetes-dashboard.yaml

授予 Dashboard 账户集群管理权限 
创建 kubernetes-dashboard-admin.rbac.yaml, 输入下面的内容
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard-admin
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard-admin
namespace: kube-system

执行下面的命令:
kubectl create -f kubernetes-dashboard-admin.rbac.yaml

查看 secret
kubectl get secret -n kube-system | grep admin

查看 token, 登录用
kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-***

查看 dashboard 的端口
kubectl get svc -n kube-system

kube-system kubernetes-dashboard NodePort 10.107.31.59 <none> 443:32356/TCP
访问 https://ip:32356

允许 master 节点运行 pods
kubectl taint nodes --all node-role.kubernetes.io/master-

备注:
初始化出错可以重置
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

第六步:K8S 加入工作节点 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#join-nodes

新机器上按照流程安装 docker 及 k8s,不用初始化集群
在 node 节点上执行下面命令:
kubeadm join --token <token> <master-ip>:6443 --discovery-token-ca-cert-hash sha256:<hash>

备注:
获取 token,在 master 节点上执行
kubeadm token list

如果不存在则创建 token,token 有效期是24小时
kubeadm token create

获取 cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'


错误处理:Failed to request cluster info, will try again: [Get https://172.18.80.92:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid],时间不同步造成的
date
yum install ntp
ntpdate cn.pool.ntp.org

第七步:安装 Helm(master 节点)

安装 k8s 包管理工具 helm:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

创建 tiller:
kubectl -n kube-system create sa tiller && kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller

安装 tiller:
helm init --skip-refresh --upgrade --service-account tiller

第八步:安装 OpenFaas(master 节点)

安装 faas-cli:
curl -sL cli.openfaas.com | sudo sh

创建 OpenFaas 命名空间:
kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml

添加 OpenFaas helm 的 repo:
helm repo add openfaas https://openfaas.github.io/faas-netes/

helm repo update

创建 OpenFaas 的管理员登录密码:
kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password=1234567890

更新 OpenFaas 命名空间:
helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set basic_auth=true

首先登录 OpenFaas:
faas-cli login -g http://ip:31112 -u admin -p 1234567890

查看 OpenFaas 的 Pod:

kubectl get pods -n openfaas