kubeadm部署k8s集群1.20.0版本

1.3 Kubernetes集群架构组件
1)Master组件

kube-apiserver
(Kubernetes API)集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
kube-schedule
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
2)Node组件 
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
容器引擎,运行容器
1)Pod

最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的
2)Controller

ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod
Job:一次性任务
Cronjob:定时任务
3)更高级层次对象,部署和管理Pod

Service:
防止Pod失联;定义一次Pod的访问策略
Service抽象层不过是iptables或者ipvs中的规则而已
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4)网络解决方案

K8S通过CNI插件体系来接入外部网络服务解决方案
常见的有:
flannel:网络配置相关
calico:网络配置、网络策略
canel:flannel的网络配置 + calico的网络策略
5)三种网络

Pod网络:Pod的地址是配置在Pod内部的网络名称空间上的,是能ping通的,就像正常主机上的地址一样
Service网络(集群网络):Service的地址是虚拟的,它只存在于iptables或者ipvs的规则之中
节点网络:各个节点也应该有一个网络
各个Pod运行在同一个网络中,而service是另外一个网络;Pod和service的地址是不同网段的。

接入外部访问时,先接入节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。

同一Pod内的多个容器之间通过 lo 接口进行通信。

两个Pod之间可以直接进行通信:通过隧道的方式(Overlay叠加网络)来转发二层报文,使得它们虽然扩主机但是好像工作在同一个二层网络中。访问对方Pod所在节点的位置,然后再代理到Pod内部的容器上。


########################################
##环境准备,以下在所有机器上操作(1台master,2台node机器):

# 关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  
# 临时关闭
setenforce 0  

# 关闭swap
# 临时
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
在所有的Kubernetes节点执行以下脚本(若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack):
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
#安装相关管理工具
yum install ipset ipvsadm -y


#设置hostname
hostnamectl set-hostname xxx

# 添加hosts
cat >> /etc/hosts << EOF
120.24.61.180 gitlab
120.78.183.238 node1
EOF

#如果机器时区、时间不对进行以下操作
#更改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#安装ntpdate工具
yum -y install ntp ntpdate
#设置系统时间与网络时间同步
ntpdate 0.asia.pool.ntp.org
#将系统时间写入硬件时间
hwclock --systohc


########################################
##安装Docker、Kubernetes

#安装yum-utils
yum install -y yum-utils

#配置docker的yum地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装指定版本
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

#查看docker版本
docker --version

#启动&开机启动docker
systemctl enable docker
systemctl start docker

#配置docker的镜像源
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

#加载&重启
systemctl daemon-reload
systemctl restart docker

#配置k8s的yum源地址
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


#安装 kubelet,kubeadm,kubectl
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9

#开机启动kubelet
systemctl enable kubelet


########################################
##部署Kubernetes

#初始化master节点
kubeadm init \
--apiserver-advertise-address=192.168.0.1 \
--control-plane-endpoint=k8s \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16   #等下如果要安装的网络插件是Calico,需要进入它yaml文件625行处把192.168.0.0/16修改为10.244.0.0/16再安装。因为192.168.0.0/16段与master 192.168.10.11起冲突。flannel网络插件默认ip是10.244.0.0/16所以不需要改。--control-plane-endpoint这里要改成主机名字a

#初始化好了执行以下命令
无论在master节点或node节点,要能够执行kubectl命令必须进行以下配置,从节点没有/etc/kubernetes/admin.conf就拷贝过去执行以下命令
mkdir -p $HOME/.kube
scp -r /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/

scp -r /etc/kubernetes/admin.conf root@node2:/etc/kubernetes/
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

cat << EOF >> ~/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bashrc

#安装Calico网络插件
在master节点上安装即可,其他节点加入k8s集群后会自动安装
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml   #如果下载不了就用浏览器访问,复制源码粘贴。记得在calico.yaml文件里的625行处把192.168.0.0/16修改为10.244.0.0/16。
kubectl apply -f calico.yaml

#加入Node节点
#把初始化master节点的最后一句话在node1、node2上执行,如:
kubeadm join k8s-master:6443 --token 3vckmv.lvrl05xpyftbs177 \
    --discovery-token-ca-cert-hash sha256:1dc274fed24778f5c284229d9fcba44a5df11efba018f9664cf5e8ff77907240
	
#默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token
kubeadm token create --print-join-command

#查看所有节点状态
kubectl get nodes


########################################
##安装KubeSphere

#先安装nfs文件系统
#在每个机器执行
yum install -y nfs-utils


#在master执行以下命令 
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

#执行以下命令,创建共享目录
mkdir -p /nfs/data

#在master执行
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server

#使配置生效
exportfs -r

#检查配置是否生效
exportfs

#如果想同步nfs数据到Node节点,可以在Node节点执行以下命令
showmount -e 192.168.10.11
mkdir -p /nfs/data
mount -t nfs 192.168.10.11:/nfs/data /nfs/data


#配置默认存储
#修改附件sc.yaml里的两处ip为master ip再执行安装
kubectl apply -f sc.yaml

#确认配置是否生效
kubectl get sc

#安装集群指标监控组件 metrics-server
#执行附件metrics.yaml安装
kubectl apply -f metrics.yaml


#开始安装KubeSphere
#执行附件kubesphere-installer.yaml、cluster-configuration.yaml
kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml

#查看安装进度
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

#访问任意机器的 30880端口
账号 : admin
密码 : P@88w0rd


#解决etcd监控证书找不到问题
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs  --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt  --from-file=etcd-client.crt=/etc/kubernetes/pki/apiserver-etcd-client.crt  --from-file=etcd-client.key=/etc/kubernetes/pki/apiserver-etcd-client.key



########################################
##Kubernetes集群重置初始化

#首先需要在master主机上将node1子节点解除关系(节点node2同理)
kubectl drain ks-n1 --delete-local-data --force --ignore-daemonsets
#再删除node1节点(节点node2同理)
kubectl delete node ks-n1
#再执行重置
kubeadm reset
#再执行以下命令
rm -rf /root/.kube
rm -rf /etc/cni/net.d
iptables -F

#Node节点也要执行重置
kubeadm reset
#再执行以下命令
rm -rf /etc/cni/net.d
iptables -F

#所有机器删除tunl0网络
ifconfig tunl0 down
ip link delete tunl0
#删不掉可以执行以下命令删除
rmmod ipip

#所有机器重启
reboot

#再后就是初始化master节点
kubeadm init ...



########################################
##内核软死锁(soft lockup)bug原因分析

#Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。

#修改阈值为30,写入文件
echo 30 > /proc/sys/kernel/watchdog_thresh
#修改阈值为30,临时生效
sysctl -w kernel.watchdog_thresh=30
#修改阈值为30,写入启动文件
echo "kernel.watchdog_thresh=30" >> /etc/sysctl.conf


k8s的图形化管理工具之 kuboard 

wget  https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml 
# 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令# 获取token,为登录kuboard做准备
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
访问地址:http://192.168.11.130:32567 

六:常用命令
重置集群节点命令    kubeadm reset 
查询join命令  kubeadm token create --print-join-command

Kubernetes集群信息查看及管理

3.1 Pod的创建与查看
1)信息查看

# 查看k8s集群的整体信息
kubectl  cluster-info

# 查看当前系统上已经被创建的控制器
kubectl get deployment

# 查看pod的相关信息
kubectl get pods
kubectl get pods -o wide  # 查看更详细的信息

# 查看services的相关信息
kubectl get services
kubectl get svc

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
2)创建一个pod

# 创建并运行一个特定的镜像,暴露80端口,并且只创建1个副本,干跑模式需要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1

# 如果要镜像中运行其他程序,可以写成这样(注意前面要加 -- )
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
 3)对刚刚创建的pod进行查看并访问

[root@k8s-master01 ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deploy   1/1     Running   0          3m6s   10.244.1.2   k8s-node01   <none>           <none>
[root@k8s-master01 ~]# curl 10.244.1.2
3.2 创建pod并暴露端口
在Kubernetes集群中创建一个pod,然后暴露端口,验证其是否可以正常访问
1)创建deployment

# 创建一个deployment控制器,这个控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx
2)创建service并暴露端口

kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 将nginx-deploy这个控制器(deployment  )相关的pod资源都创建为一个服务,服务名叫nginx
# --name   是service的名称
# --port   是service暴露到外部的端口
# --target-port  是pod暴露的端口
# --protocol     使用的协议,默认就是TCP
# --type         是service的类型,service有多种类型,可kubectl expose --help来查看--type选项,Defaultis 'ClusterIP'
3)查看相关信息并访问

# 查看pod和service的相关信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-8588f9dfb-t8wzr   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   78m
service/nginx        ClusterIP   10.99.193.184   <none>        80/TCP    34s

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system

# 访问:http://NodeIP:PORT,只有在集群内部的节点上才能被访问到
curl http://10.99.193.184

删除节点

设置节点不可调度
#kubectl cordon local-k8s-nd01
驱逐节点上的pod
#kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
删除节点
#kubectl delete node  k8s-node1
在需要删除的节点上执行reset,这样该节点即完全从 Cluster 中脱离开来
#kubeadm reset

删除服务

kubectl delete -f calico.yaml

重建服务

kubectl apply -f calico.yaml

重置k8s服务

kubeadm reset

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值