K8s(kubernetes)基础知识

1.K8s(kubernetes)基础特性

1.1服务发现和负载均衡

        k8s可以使用DNS名称或者自己IP地址公开容器,如果进入容器的流量很大,k8s可负载均衡并分配网络流量,从而使部署稳定。

1.2存储编排

k8s允许你自动挂载你的存储系统,例如本地存储,公共云提供等

1.3自动部署和回滚

        你可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状况更改为期望状态。例如,你可以自动化Kubernetes来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。

1.4自动完成装箱计算

        Kubernetes 允许你指定每个容器所需CPU和内存(RAM)。当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源。

1.5自我修复

        Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

1.6密钥与配置管理

Kubernetes允许你存储和管理敏感信息,例如密码、OAuth令牌和ssh密钥。你可以在不重 建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置 中暴露密钥。

2.k8s架构

1.工作方式

通过集群的方式进行工作

Kubernetes Cluster = N Master Node+ N Worker Node: N主节点+N工作节点; N>=1

高可用集群:master节点挂了,其余的节点会进行选举出master主节点。

搭建k8s集群

1.master节点和工作节点都要安装docker环境,k8s只是一个容器编排工具,需要提供docker容器环境。

为了使用方便可以手动设置主机名:set-hostname k8s-master(设置一次永久生效)

内网互信:禁用交换分区。为了保证kubelet正常工作,你必须禁用交换分区

#各个机器设置自己的域名
hostnamectl set -hostname xxXx
#将SELinux 设置为permissive 模式(相当于将其禁用)
sudo setenforce 日
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap. */#&/' /etc/fstab
​
#允许iptables"检 查桥接流量 k8s官方要求的
cat <<EOF| sudo tee /etc/modules- load . d/k8s. conf
br_ netfilter
EOF
cat <<EOF| sudo tee /etc/sysct1.d/k8s. conf
net. bridge . bridge-nf-call-ip6tables = 1
net . bridge. bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

2.安装kubelet,kubeadm,kubectl

#k8s去哪里下载的地址
cat << EOF | sudo tee /etc/yum. repos . d/kubernetes . repo
[kubernetes]
name= Kubernetes
baseurl=http://mirrors。aliyun. com/ kubernetes/yum/repos/kubernetes-e17-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
exclude=kubelet kubeadm kubectl
EOF
​
# 安装三大件
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubect1-1.20.9 --
disableexcludes=kubernetes
# 立刻启动kubelet
sudo systemctl enable hs-now kubelet
#查看 kubelet状态
systemd status kubelet  #发现一会运行一会停止 在监控

2.使用kubeadm引导集群

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube- controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pu1l registry.cn-hangzhou. aliyuncs. com/1fy_ k8s_ images/$imageName
done
EOF
​
#chmod +x  给这个文件赋予权限 并执行
chmod +x ./images.sh && ./images.sh 

2.初始化主节点

#所有机器添加master城名映射(10.140.122.4IP地址是master内网地址 cluster-endpoint是域名 所有节点执行这条命令 如果能ping通主节点证明成功)
echo "10.140.122.4 cluster-endpoint" 》> /etc/hosts
​
#主节点执行下面的命令
#主节点初始化(注意:下面的ip是masterip,域名要和上面配置的一致 cluster-endpoint)
kubeadm init \
--apiserver-advertise-address=10.140.122.4 \
--control-plane -endpoint=cluster-endpoint \
-- image-repository registry . cn-hangzhou. aliyuncs.com/1fy_ k8s_ images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
​
注意:所有网络范围不重叠不能与master重叠(所以不要改)
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
​
192.168.0.0/16所有的pod应用分配的ip都是在这个范围。集群中的任意一个机器以及应用都能通过pod分配的ip来访问这个(集群内,外网不行 需要暴露端口的方式)

3.补充知识

kubectl get node  #获取所有节点信息
​
#令牌过期可以使用下面的命令重新生成 (加入节点)
kubectl token create --print-join-command  #生成新的令牌

4.安装可视化界面dashboa

kubect1 apply -f
https://raw. githubusercontent.com/ kubernetes/dashboard/v2.3.1/aio/dep1oy/recommended.yaml
​
#手动下载资源(github国外网站)
wget  https://raw. githubusercontent.com/ kubernetes/dashboard/v2.3.1/aio/dep1oy/recommended.yaml
kubectl apply -f recommended.yaml
​
vi dashboard.yaml  #创建文件并生成
​
#设置端口:
kubectl edit svc kubernetes-dashboard -n kubernetes -dashboard
type: ClusterlP改玉type: NodePort  #暴露端口
kubectl get svc -A| grep kubernetes - dashboard
#找到端口,在安全组放行

4.重要概念:

pod ->运行中的应用叫做pod
#获取命名空间
kubectl get ns(namespace)
#创建命名空间
kubectl create ns hello
#删除命名空间
kubectl delete ns hello
默认的命名空间不能删除,可以删除自己创建的命名空间
​
文件的方式创建
apiVersion: v1
kind: Namespace
metadata:
    name:hello
kubectl -f apply *.yaml

5.pod的相关概念(k8s中运行的应用叫做pod)

运行中的一组容器,Pod是k8s中应用的最小单位,(一个pod可以部署多个容器,但是一个pod推荐只安装一个容器)
​
容器化运行环境(CRI: Container Runtime Interface)
​
创建pod
kubctl run mynginx --image=nginx #(mynginx是起个名字 --image=nginx镜像 pod里面是容器,这个容器是nginx)
#查看default 名称空间的pod 
kubectl get pod
#查看所有的pod
kubectl get pod -a
#查看pod描述(k8s集群排错)
kubctl describe pod  你自己的pod的名字
#删除pod
kubctl delete pod  pod名字
#查看pod的运行日志
kubctl logs pod名字
​
#每个pod -k8s都会分配一个ip(看到每个pod的信息)
kubectl get pod -owide
#使用pod的ip+pod里面运行容器的端口就可以访问到
例如pod的nginx的容器:curl ip:端口(curl 192.168.169.136:80)
​
#进到pod的容器里面
kubctl exec -it mynginx -- /bin/bash
​
​

5.1多容器的pod

每一个pod都会有一个唯一IP进行访问

创建多个容器 :里面的name不能一样

apiVersion: v1 #版本
kind: Pod  #pod
metadata :
  labels: #标签
    run: myapp
  name: myapp  #pod的名称
#容器详情 每一个image前面用 "-"多个也是这样
spec: 
  containers:
    - image: nginx  #nginx镜像 最新版本
      name: nginx   #nginx名字
    - image: tomcat:8.5.68  # tomcat:8.5.68 镜像tomcat:8.5.68指定版本
      name: tomcat  #tomcat名字

Restarts : pod重启几次了

6.Deployment

#自愈能力(nginx启动3个 多副本(多节点))
kubectl create deployment my-deploy --image=nginx replicas=3
kubectl get deploy  # 获取deployment
kubectl  delete deploy my-deploy
​
扩缩容( scale)
kubectl scale --replicas=5 deployment/my-deploy
#监控(1s打印一次)
watch -n 1 kubectl get pod
​
也可以通过修改yaml文件
kubectl edit deploy my-deploy
#查看这些机器都部署在哪台机器
kubectl get pod -owide
可以手动设置自愈的时间
​
#Deployment 滚动更新(灰度上线)
kubectl set image deployment/my-deploy nginx=nginx:1.16.1 --record
​
#版本回退
kubectl rollout history deployment/my-deploy  #查看所有发布的版本
kubectl rollout undo deploy/my-deploy --to-revision=1 #回到版本1

重点基础知识:

Deployment:无状态应用部署,比如微服务,提供多副本等功能
StatefulSet:有状态应用部署 ,比如redis,提供稳定的存储、网络等功能
DaemonSet:守护型应用部署,比如日志收集组件,在每个机器都运行一份
Job/CronJob:定时任务部署,比如垃圾清理组件, 可以在指定时间运行

3.服务发现:

# 集群内部访问
kubectl expose deploy my-deploy --port=8000 --target-port=80 --type=ClusterIP
​
# 集群外部也可以访问(外网也可以)
kubectl expose deploy my-deploy --port=8000 -- target-port=80 --type=NodePort
​
​
Ingress网关(本质上是一个nginx) https http
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Kubernetes 的网络系统是由多个组件组成的, 它们协作为应用程序提供网络连接和通信. 其中一些主要的组件包括: - kube-proxy: 运行在每个节点上, 负责为 Pod 和 Service 提供代理服务. - kube-dns: 为应用程序提供 DNS 服务. - 网络插件: 用于为 Pod 提供网络连接, 支持不同的网络模型, 如 Calico, Flannel, Cilium 等. - Service: 为应用程序提供负载均衡和服务发现. Kubernetes 的网络模型是基于 Pod 的, 每个 Pod 都有一个独立的 IP 地址, 使得容器间直接通信成为可能. Service 则提供了一种发现和负载均衡的机制, 让外部客户端可以访问 Pod. ### 回答2: KubernetesK8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。下面是一些与K8s网络相关的知识点。 1. 服务发现:K8s通过DNS(域名系统)服务提供内部服务发现机制。每个服务都会被分配一个唯一的域名,其他服务可以通过该域名访问该服务。 2. Pod网络:Pod是K8s中的最小调度单元,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址,容器可以通过本地回环地址访问其他Pod中的容器。 3. 容器网络接口(CNI):CNI是一个规范,用于定义容器网络的实现方式。K8s使用CNI插件来设置和管理Pod的网络。不同的CNI插件可以支持不同的网络方案,如VLAN、VXLAN、Calico等。 4. 服务代理:K8s使用服务代理来实现服务之间的通信。服务代理可以在集群各个节点上运行,并通过负载均衡来分发到后端Pod。 5. 网络策略:K8s允许用户通过网络策略来定义集群中的网络访问规则。网络策略可以限制哪些Pod可以与另一个Pod通信,以及允许的协议和端口。 6. Ingress控制器:Ingress控制器是K8s中用于管理入站网络流量的组件。它可以将外部流量路由到集群内部的服务,并提供负载均衡和SSL终止等功能。 7. 可插拔网络解决方案:K8s提供了一些可插拔的网络解决方案,如Flannel、Calico等。这些解决方案可以根据具体需求选择,以提供不同的网络拓扑结构和性能。 总而言之,K8s网络相关的知识点包括服务发现、Pod网络、CNI、服务代理、网络策略、Ingress控制器和可插拔网络解决方案。这些知识点帮助我们理解和管理K8s集群中的网络配置和通信。 ### 回答3: Kubernetes(简称k8s)是一种用于容器编排和管理的开源平台,它涉及到一些重要的网络概念和组件。 首先,k8s网络模型是基于虚拟网络的概念。每个k8s集群中的容器都会被分配一个独立的IP地址,并且可以通过这个IP地址跨节点进行通信。这是通过一个称为kube-proxy的组件实现的,它会在每个节点上监听API服务器上的变化,并使用iptables或者IPVS等工具在宿主机上进行流量转发。 其次,k8s通过Service和Endpoint来暴露和访问容器。Service是一个逻辑概念,用于封装一组具有相同功能的容器,在集群内部提供服务的访问入口。一个Service可以通过ClusterIP、NodePort或者LoadBalancer等不同的类型暴露。而Endpoint是实际运行容器的IP和端口的集合,用于告诉Service流量应该转发到哪里。 此外,k8s还支持Ingress资源,用于在集群外部暴露服务,实现外部访问。Ingress通过定义一个或多个规则,将外部流量转发到不同的Service上,从而实现域名或路径的复杂路由。 最后,网络插件是k8s网络中的重要组件。k8s提供了一些默认的网络插件,如Flannel、Calico等,用于管理Pod之间的网络通信。网络插件负责创建网络的子网和路由表,并将Pod的IP地址与宿主机的虚拟网卡进行关联。 总结来说,k8s网络涉及到虚拟网络、kube-proxy、Service、Endpoint、Ingress等概念和组件,这些都是为了实现容器间的通信和外部访问的需求。不同的网络插件可以根据具体需求选择,以满足集群的网络需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值