前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s部署实战

k8s部署实战

原创
作者头像
AndreKzWu
修改2022-09-21 17:14:36
7810
修改2022-09-21 17:14:36
举报
文章被收录于专栏:AndrekzWu的专栏AndrekzWu的专栏

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

部署项

说明

备注

代码仓库

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
image.png
image.png
  • 修改虚拟机IP
代码语言:txt
复制
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}}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、微服务架构部署的方案
  • 二、微服务架构部署的实施
    • 2.1 k8s
      • 2.1.1 服务器准备
      • 2.1.2 修改节点名称
      • 2.1.3 关闭防火墙 禁用SELinux
      • 2.1.4 系统参数修改
      • 2.1.5 docker 安装
      • 2.1.6 安装kubectl,kubeadm,kubelet(所有节点)
      • 2.1.7 初始化master节点
      • 2.1.8 加入 node节点
      • 2.1.9 配置ingress-controller
      • 2.1.10 测试
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档