K8s(kubernetes)基础知识
例如,你可以自动化Kubernetes来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。kubctl run mynginx --image=nginx #(mynginx是起个名字 --image=nginx镜像 pod里面是容器,这个容器是nginx)k8s可以使用DNS名称或者自己IP地址公开容器,如果进入容器的流量很大,k8s可负载均衡并分配网络流量,从而使部署稳定。运行中
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
更多推荐
所有评论(0)