栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

K8s部署实践

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

K8s部署实践

一、准备 服务器准备
服务器功能ip备注
A管理节点、工作节点10.10.xx.13x
B工作节点10.10.xx.23x
C工作节点10.10.xx.xx
概念

master

  • kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。
  • kubeadm:用于初始化cluster。

node

  • Kubelet:运行在cluster所有节点上,负责启动POD和容器。
  • Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技术来创建容器。

  • Pod:Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是Kubernetes的最小可部署单元。Pod的中文译词是豌豆荚,docker容器就像是豆子运行在豌豆荚内。
  • ReplicaSet:先说下Replication Controller。Replication Controller的作用是确保Pod以指定的副本个数运行。
    ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))。
    在yaml文件中通过spec.replicas声明pod的副本数。
  • Deployment:Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。
  • Service:试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?
    答案是使用Service。
    k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
    请说人话:前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。

总结一下:Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。

环境准备
  1. 借助ntp服务设置各节点的时间同步

    yum -y install chrony
    systemctl start chronyd && systemctl enable chronyd
    chronyc sources
  2. 通过DNS完成各节点名称解析,测试环境主机,测试用hosts文件代替(各个节点同步设置)

    10.10.10.137 k8s-master01
    10.10.10.236 k8s-node01
    10.10.10.52 k8s-node02
    
    hostnamectl set-hostname k8s-master01
    hostnamectl set-hostname k8s-node01
    bash
  3. 配置ssh免密登入

    ssh-keygen -t rsa
    ssh-copy-id k8s-node01
    ssh-copy-id k8s-node02
  4. 禁用SELinux&禁用Swap设备

    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    free -m
  5. 关闭各节点iptables和firewalld服务(可选择打开端口)

1|k8s master需要开启以下端口
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10248/tcp
firewall-cmd --permanent --add-port=10249/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
# only if you want NodePorts exposed on control plane IP as well
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
systemctl restart firewalld

2|k8s node需要开启以下端口
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
systemctl restart firewalld

8472/udp为flannel的通信端口

443/tcp 为Kubernetes server端口

注意一点:一定要执行以下命令打开NAT,默认是关闭状态,这里踩过坑!!

1

2

3

4

5

firewall-cmd --add-masquerade --permanent

# 检查是否允许NAT转发

firewall-cmd --query-masquerade

# 关闭NAT转发

firewall-cmd --remove-masquerade

 如果你使用了istio还有把istio-pilot的端口加到防火墙里:

1

firewall-cmd --permanent --add-port=15010-15014/tcp

二、安装 2.1 安装docker

参考docker官网

2.2 部署kubernetes

1、更新yum源(各节点)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2、安装、开机自启kubelet(各节点)

yum -y install kubelet kubectl kubeadm
systemctl enable kubelet

3、配置Master节点初始化

kubeadm version #查看安装的版本
kubeadm init --kubernetes-version="v1.23.1" --pod-network-cidr=10.80.0.0/16 --image-repository registry.aliyuncs.com/google_containers
#初始化
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBEConFIG=/etc/kubernetes/admin.conf

4、在master中安装flannel插入

wget https://raw.githubusercontent.com/coreos/flannel/master/documentation/kube-flannel.yml如果wget下载有问题就用其他方法把yml文件下载下来
kubectl apply -f kube-flannel.yml

用kubectl查看状态是否变化为Ready。

kubectl get nodes

5、生成token

#如果过期可先执行此命令
kubeadm token create    #重新生成token
#列出token
kubeadm token list  | awk -F" " '{print $1}' |tail -n 1

6、获取CA公钥的哈希值

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

7、加入node

kubeadm join k8s-master01:6443 --token qzj6hk.dolv4zlcscqkoc5e --discovery-token-ca-cert-hash sha256:fe8b1ce25d0e121bf874ebfb7353eb5fa8a5531d7aed7aa22b41ef9f5e051ca8

8、查看节点是否加入

kubectl get nodes
FAQ

1、kubelet服务启动失败
注意kubelet的cgroup和docker都设置为systemd

journalctl -f -u kubelet 查看日志发现,报错如下:

kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”

这个里要修改3个配置文件为systemd

1.vim /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]

2.vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
在KUBELET_KUBECONFIG_ARGS 后面追加 --cgroup-driver=systemd

Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=systemd"
3.vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2"
systemctl daemon-reload
systemctl restart kubelet

2、master节点可以当node使用

kubectl taint nodes --all node-role.kubernetes.io/master

3、 外部访问dashboard

首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是 ttg11):

kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' &

然后本地 ssh 端口转发到跳板机:

ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11

然后通过如下本地地址访问:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

4、pod在node上创建一直creating

network: failed to set bridge addr: "cni0" already has an IP address
rm -rf /var/lib/cni/
rm -rf /etc/cni/
ifconfig cni0 down
ip link delete cni0

5、 pod删除不掉

强制删除

kubectl delete pod -n go-test --force gotest-backend-deployment-6796ccf98c-f65bv 

6、Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration

Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration_Maxwell_Dncey的博客-CSDN博客_kubectl node taint1.指定pod到指定的node上#1.1查看节点的lebelkubectl get nodes --show-labels#1.2获取到该节点的label信息ip-10-100-2-80 Ready 60d v1.14.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux...https://blog.csdn.net/weixin_42495873/article/details/103364868

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号