k8s部署实战

一、微服务架构部署的方案

部署项

说明

备注

代码仓库

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)
image.png
image.png
  • 修改虚拟机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,名称名称相同

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

systemctl stop firewalld
systemctl disable firewalld

### 禁用SELinux
setenforce 0
# 编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:
SELINUX=disabled

##关闭系统Swap
swapoff -a

2.1.4 系统参数修改

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 安装

yum install -y docker 

pull pause根容器(每个pod都需要根容器)

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(所有节点)

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

查看可用的版本并安装

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节点

使用配置文件方式

## 使用配置文件方式
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

初始化

kubeadm init --config kubeadm.yaml

成功后记住,后面节点加入时需要,token是24小时过期

可以通过命令产生,加入节点:kubeadm token create --print-join-command

kubeadm join 192.168.1.179:6443 --token abcdef.0123456789abcdef \\
    --discovery-token-ca-cert-hash sha256:51d7b6863204bff666916e6f302df31ebd33f0a5b0fa9889df3c4b9d5bb4ebf6

产生新的token,例如:

产生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用户

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

安装flannel网络

 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中拷贝)

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

设置 IP相关参数

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
echo "1" > /proc/sys/net/ipv4/ip_forward

kubeadm join 例如:

kubeadm join 192.168.1.179:6443 --token abcdef.0123456789abcdef \\
    --discovery-token-ca-cert-hash sha256:51d7b6863204bff666916e6f302df31ebd33f0a5b0fa9889df3c4b9d5bb4ebf6

问题:

failed to set bridge addr: "cni0" already has an IP address diff
解决方案:
将这个错误的网卡删掉,它会自己重建,这里采用删除重生的方法,首先停用网络,然后删除配置
ifconfig cni0 down    
ip link delete cni0

2.1.9 配置ingress-controller

所有节点执行

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配置文件

kubectl edit cm kube-proxy -n kube-system

将 mode 改成 ipvs
将 masqueradeAll 改成 true

重启kube-proxy的pod

 kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

查看重启后的pod日志,发现模式已经变成了ipvs

 kubectl get pod -n kube-system | grep kube-proxy 

修改k8s默认端口范围

kubernetes默认端口号范围是 30000-32767 ,如果期望值不是这个区间则需要更改。

/etc/kubernetes/manifests/kube-apiserver.yaml
添加配置参数
--service-node-port-range=1-65535
修改后过10s,配置会自动生效

修改 ingress-nginx service nodePort 为 80、443

开启ingress-nginx(以0.30.0版本为例)

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(镜像拉取不到,可以用aliyun的镜像)

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和外部端口请求不到

iptables -P FORWARD ACCEPT # 容器所在的服务器执行,开启转发功能

2.1.10 测试

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}}

版权声明:
作者:AndreKzWu
链接:https://jkboy.com/archives/11152.html
来源:随风的博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
k8s部署实战
节点名称如果都是lcoal,会造成后续加入 kubeadm join 时,pods pending,名称名称相同
<<上一篇
下一篇>>