一、微服务架构部署的方案
部署项 | 说明 | 备注 |
---|---|---|
代码仓库 | gogs | |
镜像仓库 | harbor | |
容器方案 | k8s/docker | |
网关 | kong | |
业务服务 | GO service | |
日志 | ELK filebeat | |
监控 | Prometheus grafana |
二、微服务架构部署的实施
2.1 k8s
2.1.1 服务器准备
- 采用vm ware虚拟机,导入两个centos 7.4系统(2 core 2G)
- vmware网络设置为网桥模式(网桥模式和物理机共用网卡,相当于物理机变成了交换机,会使用和物理机相同的网段,占用真实的IP)
- 修改虚拟机IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.179
NETMASK=255.255.254.0
GATEWAY=192.168.1.253
DNS1=8.8.8.8
重启网络服务
service restart network
2.1.2 修改节点名称
节点名称如果都是lcoal,会造成后续加入 kubeadm join 时,pods pending,名称名称相同
代码语言:text复制master节点:hostnamectl --static set-hostname k8s-master
node1节点:hostnamectl --static set-hostname k8s-node1
node2节点:hostnamectl --static set-hostname k8s-node2
2.1.3 关闭防火墙 禁用SELinux
代码语言:text复制systemctl stop firewalld
systemctl disable firewalld
### 禁用SELinux
setenforce 0
# 编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:
SELINUX=disabled
##关闭系统Swap
swapoff -a
2.1.4 系统参数修改
代码语言:text复制cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2.1.5 docker 安装
代码语言:text复制yum install -y docker
pull pause根容器(每个pod都需要根容器)
代码语言:text复制wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
2.1.6 安装kubectl,kubeadm,kubelet(所有节点)
代码语言:text复制wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
yum clean all
yum makecache
查看可用的版本并安装
代码语言:text复制yum list --showduplicates | grep 'kubeadm|kubectl|kubelet'
yum install kubeadm-1.15.0 kubectl-1.15.0 kubelet-1.15.0 --disableexcludes=kubernetes
systemctl enable --now kubel
备注:此处启动kubelet后会启动失败,因为缺少相关的配置,后续初始化后会自动生成
2.1.7 初始化master节点
使用配置文件方式
代码语言:text复制## 使用配置文件方式
kubeadm config print init-defaults > kubeadm.yaml
## 修改配置文件 kubeadm.yaml.yaml
advertiseAddress 本机地址,例如 192.168.1.179 (虚拟机master节点)
kubernetesVersion: v1.15.0 // k8s版本号,设置为当前安装的版本号
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 172.17.0.0/16
初始化
代码语言:text复制kubeadm init --config kubeadm.yaml
成功后记住,后面节点加入时需要,token是24小时过期
可以通过命令产生,加入节点:kubeadm token create --print-join-command
代码语言:text复制kubeadm join 192.168.1.179:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:51d7b6863204bff666916e6f302df31ebd33f0a5b0fa9889df3c4b9d5bb4ebf6
产生新的token,例如:
代码语言:text复制产生token:
#kubeadm token create
#oapcal.mlearjiaijljtyeq
取ca证书sha256编码hash值:
#openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#8832ca46fa644aa8d4864119430985875f27f29bc68dd86797e0b0fa4db60fb4
#kubeadm join 192.168.1.130:6443 --token oapcal.mlearjiaijljtyeq --discovery-token-ca-cert-hash sha256:8832ca46fa644aa8d4864119430985875f27f29bc68dd86797e0b0fa4db60fb4
配置kubectl认证信息root用户
代码语言:text复制echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
安装flannel网络
代码语言:text复制 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
2.1.8 加入 node节点
重新初始化节点:kubeadm reset
配置kubectl认证信息root用户(admin.conf从master中拷贝)
代码语言:text复制echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
设置 IP相关参数
代码语言:text复制echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
echo "1" > /proc/sys/net/ipv4/ip_forward
kubeadm join 例如:
代码语言:text复制kubeadm join 192.168.1.179:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:51d7b6863204bff666916e6f302df31ebd33f0a5b0fa9889df3c4b9d5bb4ebf6
问题:
代码语言:text复制failed to set bridge addr: "cni0" already has an IP address diff
解决方案:
将这个错误的网卡删掉,它会自己重建,这里采用删除重生的方法,首先停用网络,然后删除配置
ifconfig cni0 down
ip link delete cni0
2.1.9 配置ingress-controller
所有节点执行
代码语言:text复制cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
在所有节点上安装ipset软件包
yum install ipset -y
为了方便查看ipvs规则我们要安装ipvsadm(可选)
yum install ipvsadm -y
修改kube-proxy配置文件
代码语言:text复制kubectl edit cm kube-proxy -n kube-system
将 mode 改成 ipvs
将 masqueradeAll 改成 true
重启kube-proxy的pod
代码语言:text复制 kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
查看重启后的pod日志,发现模式已经变成了ipvs
代码语言:text复制 kubectl get pod -n kube-system | grep kube-proxy
修改k8s默认端口范围
kubernetes默认端口号范围是 30000-32767 ,如果期望值不是这个区间则需要更改。
代码语言:text复制/etc/kubernetes/manifests/kube-apiserver.yaml
添加配置参数
--service-node-port-range=1-65535
修改后过10s,配置会自动生效
修改 ingress-nginx service nodePort 为 80、443
开启ingress-nginx(以0.30.0版本为例)
代码语言:text复制kubectl apply -f /data/k8s/ingress-nginx/ingress-nginx-nginx-0.30.0/deploy/static/mandatory.yaml
kubectl apply -f /data/k8s/ingress-nginx/ingress-nginx-nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
错误处理1
代码语言:text复制Failed to pull image "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0": rpc error: code = Unknown desc = context canceled
### 解决方案
# docker pull registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
# docker tag 89ccad40ce8e quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
或修改mandatory.yaml 配置文件的镜像为aliyun镜像
错误处理2(多salve下,通过ingress的host和外部端口请求不到)
代码语言:text复制iptables -P FORWARD ACCEPT # 容器所在的服务器执行,开启转发功能
2.1.10 测试
代码语言:text复制1) 配置测试程序的 ingress
kubectl apply -f /data/k8s/iris-template/svc.yaml
kubectl apply -f /data/k8s/iris-template/deployment.yaml
kubectl apply -f /data/k8s/iris-template/ingress.yaml
其中 deployment,如果镜像是本地的,可以修改参数
imagePullPolicy: IfNotPresent 或 Never
2) 在外部机器配置 host
192.168.1.181 iris-template.com ## IP为节点机器真实IP
3) curl http://iris-template.com/api/test?value=119
{"status":0,"msg":"success","data":{"value":119}}