• [技术干货] k8s入门指南
    Kubernetes是一个用于容器编排和管理的开源平台。它可以帮助您简化容器化应用程序的部署、扩展和管理。本指南将引导您完成Kubernetes的基本概念和入门操作。1. 安装Kubernetes集群首先,您需要设置Kubernetes集群。以下是一些常见的安装选项:Minikube: 适用于本地开发和学习的单节点Kubernetes集群。kubeadm: 用于在Linux系统上快速设置多节点Kubernetes集群。选择适合您需求的安装选项,并按照相关文档进行操作。2. 创建和管理应用程序接下来,您将学习如何使用Kubernetes部署和管理应用程序。创建DeploymentDeployment是一种Kubernetes资源,用于定义应用程序的部署和扩展。创建一个名为myapp-deployment的Deployment,指定容器镜像和副本数量:apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp-container image: your-docker-image ports: - containerPort: 8080将上述内容保存为myapp-deployment.yaml文件,并使用以下命令创建Deployment:kubectl apply -f myapp-deployment.yaml创建ServiceService是一种Kubernetes资源,用于公开应用程序内部的服务。创建一个名为myapp-service的Service,将流量路由到Deployment:apiVersion: v1 kind: Service metadata: name: myapp-service spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer将上述内容保存为myapp-service.yaml文件,并使用以下命令创建Service:kubectl apply -f myapp-service.yaml扩展应用程序要增加应用程序的副本数量,可以使用以下命令:kubectl scale deployment myapp-deployment --replicas=5这将将myapp-deployment的副本数量扩展到5个。3. 监控和管理集群Kubernetes提供了各种工具和资源,可用于监控和管理集群。查看集群状态要检查集群状态和节点信息,可以使用以下命令:kubectl cluster-info kubectl get nodes查看Pod状态和日志要查看正在运行的Pod的状态和日志,可以使用以下命令:kubectl get pods kubectl logs <pod-name>更新应用程序要更新应用程序的镜像版本或配置,可以编辑相关的Deployment或ConfigMap,并使用以下命令进行更新:kubectl apply -f myapp-deployment.yaml结论这份简洁的Kubernetes入门指南帮助您了解了Kubernetes的基本概念和操作。您可以继续深入学习Kubernetes的更多高级功能和概念,以便更好地管理和扩展您的应用程序。
  • [其他] k8s使用私有镜像仓库的访问凭据配置
     k8s创建私有仓库凭据有两种方式  1.使用kubectl命令创建secret 2.使用docker凭证作为k8s的凭据。  1.使用kubectl命令创建secret kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL <name>:凭据名称  DOCKER_REGISTRY_SERVER:私有服务地址  DOCKER_USER:登录账号  DOCKER_PASSWORD:密码  DOCKER_EMAIL:邮箱  2.使用docker凭证作为k8s的凭据。 1.首先登录私有服务  docker login -u admin -p 123456 192.168.0.76:81 2.查看auth文件内容  cat /root/.docker/config.json 3.基于auth文件创建secret  kubectl create secret generic mysecrettest \     --from-file=.dockerconfigjson=/root/.docker/config.json \     --type=kubernetes.io/dockerconfigjson 3.在yaml文件中使用凭据 apiVersion: v1kind: Podmetadata: name: mytest namespace: defaultspec: containers: - name: mytest image: zztestimg:latest imagePullSecrets: - name: mysecrettest
  • [其他] k8s一个部署springboot项目的yaml文件示例
    apiVersion: apps/v1kind: Deploymentmetadata: name: my-spring-boot-appspec: replicas: 3 selector: matchLabels: app: my-spring-boot-app template: metadata: labels: app: my-spring-boot-app spec: containers: - name: my-spring-boot-app image: my-spring-boot-app:1.0.0 ports: - containerPort: 8080 volumeMounts: - mountPath: /app name: my-app-volume volumes: - name: my-app-volume persistentVolumeClaim: claimName: my-app-pvc---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: my-app-pvc labels: app: my-spring-boot-appspec: accessModes: - ReadWriteOnce storageClassName: standard resources: requests: storage: 10Gi在上面的示例中,我们定义了一个名为“my-spring-boot-app”的Deployment Pod,它将在Kubernetes集群中部署3个相同的容器(容器名为“my-spring-boot-app”)。我们还定义了该Pod的Selector,该Selector告诉Kubernetes Pod将被部署到哪个部署节点上。在Pod的Template中,我们使用了一个VolumeMount,该VolumeMount将应用程序的主目录挂载到容器内的“/app”目录中。在该VolumeMount的PersistentVolumeClaim中,我们指定了应用程序的名称(“my-app”),以及应用程序应该使用的存储类型(Standard级别)和存储大小(10GiB)。要使用上述YAML文件部署Spring Boot应用程序并使用文件卷,您需要将该文件上传到Kubernetes集群,并使用Kubernetes客户端(如kubectl)将该Pod添加到Kubernetes集群中。然后,您需要使用Kubernetes客户端(如kubectl)上传一个PersistentVolumeClaim并将其挂载到您的应用程序容器中的FileVolume上。
  • [其他] Kubernetes YAML文件格式说明
    Kubernetes YAML格式是一种配置文件格式,用于描述和配置容器化应用程序。YAML文件使用键值对的形式,以简单易读的方式描述应用程序的配置。下面是一个简单的 Kubernetes YAML 配置文件示例:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image ports: - containerPort: 8080在这个示例中,我们定义了一个名为“my-pod”的 Pod 类型,并定义了一个名为“my-container”的 Container 类型。Pod 类型定义了 Pod 的名称和版本,Container 类型定义了 Pod 中的容器。 YAML 文件中的键值对使用冒号(:)分隔,并且可以包含注释。在示例中,注释是以 # 符号开头的。 使用 Kubernetes YAML 配置文件可以方便地管理和配置容器化应用程序,使其具有良好的可维护性和可扩展性。kind的类型Kubernetes YAML文件中的类型主要包括 Pod、Deployment、Service、PersistentVolume、PersistentVolumeClaim、ConfigMap、Ingress、PodSecurityPolicy、HorizontalPodAutoscaler 等。其中,下面是一些常用的类型:Pod:表示容器化应用程序的一个实例。它可以包含多个容器,并且可以使用容器名称或 IP 地址来访问容器内的应用程序。Deployment:表示一组相关的容器,以便在容器中运行相同的版本。一旦Deployment 被部署,它将自动维护和更新容器。Service:表示一个通过名称相互通信的 Pod 实例。Service 可以通过名称或 IP 地址访问容器内的应用程序。PersistentVolume:表示持久化存储数据的 Pod 容器。它可以存储容器内的数据,以便在 Pod 重启时恢复。PersistentVolumeClaim:表示为 Pod 存储持久化存储数据的一项声明。它可以将 Pod 的存储需求注册到 Kubernetes 中。ConfigMap:表示应用程序配置的一个字典。它可以存储应用程序配置信息,例如应用程序配置文件、环境变量等。Ingress:表示 Kubernetes 的入站规则。它可以控制 Pod 访问应用程序的网络端口。PodSecurityPolicy:用于保护 Pod 内的容器免受外部攻击的安全组件。HorizontalPodAutoscaler:用于管理 Kubernetes 上 Pod 的自动扩展。它可以动态调整 Pod 内容器的实例数以达到平衡状态。以下是一个简单的 Kubernetes YAML 配置文件示例,其中使用了 Pod 类型:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image ports: - containerPort: 8080在这个示例中,Pod 类型被用于定义 Pod 实例的类型。使用 Pod 类型时,name 和 image 关键字后面的字符串就是 Pod 的名称和版本。使用 containers 关键字定义 Pod 的容器。容器之间用逗号分隔,可以指定多个容器。使用 ports 关键字定义 Pod 中的容器端口映射。容器之间使用冒号 : 分隔,可以指定多个容器的端口映射。在这个示例中,Pod 的实例数量为 1,容器的版本为 1.0,容器名称为 my-container,容器的容器端口映射为 8080。Pod 的实例使用了多个容器,每个容器都有不同的版本和名称。这样,可以使 Pod 中的容器相互隔离,并为不同的应用程序提供隔离和管理。
  • [其他] k8s安装Dashboard
    1.下载yaml文件,具体对应版本参考: wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml 2.执行 kubectl apply -f recommended.yaml 3.查看安装情况 kubectl get pods --all-namespaces -o wide | grep dashboard 4.查看svc  kubectl get svc --all-namespaces 5.删除现有的 dashboard 服务,因为该服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要改成 NodePort 类型的 kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard 6.创建配置文件dashboard-svc.yaml并上传服务器 kind: Service  apiVersion: v1  metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboard  spec:  type: NodePort  ports:    - port: 443      targetPort: 8443  selector:    k8s-app: kubernetes-dashboard 7.创建该 Service kubectl apply -f dashboard-svc.yaml 8.再次查看服务 kubectl get svc --all-namespaces 9.创建 kubernetes-dashboard 管理员角色,dashboard-svc-account.yaml  apiVersion: v1  kind: ServiceAccount  metadata:  name: dashboard-admin  namespace: kube-system  ---  kind: ClusterRoleBinding  apiVersion: rbac.authorization.k8s.io/v1  metadata:  name: dashboard-admin  subjects:  - kind: ServiceAccount    name: dashboard-admin    namespace: kube-system  roleRef:  kind: ClusterRole  name: cluster-admin  apiGroup: rbac.authorization.k8s.io  10.执行创建 kubectl apply -f dashboard-svc-account.yaml 11.获取token kubectl get secret -n kube-system |grep admin|awk '{print $1}'  kubectl describe secret dashboard-admin-token-xxxxx -n kube-system|grep '^token'|awk '{print $2}' 12.浏览器访问,如果是edge浏览器会提示“你的连接不是专用连接”,只需要键盘输入thisisunsafe就可继续访问。 cid:link_0 12.修改token过期时间,默认过期时间是15分钟。 - '--token-ttl=832000' 
  • 华为云一键安装k8s脚本
    服务器配置节点(华为云服务器)配置master2vCPUs | 4GiB | s6.large.2 CentOS 7.8 64bitnode12vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bitnode22vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit1.master节点安装脚本:install_k8s_master.sh。sh文件上传到服务器后执行:chmod +x install_k8s_master.sh sh install_k8s_master.sh安装过程中会有根据提示要求键盘输入。安装docker过程中遇到卡着需要输入y,有两次#!/bin/bash# Kubernetes部署环境要求:#(1)一台或多台机器,操作系统CentOS 7.x-86_x64#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;#(3)集群内各个机器之间能相互通信;#(4)集群内各个机器可以访问外网,需要拉取镜像;#(5)禁止swap分区; # 安装步骤#1. 安装docker#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose##2. 安装k8s#2.1 初始化环境#2.2 添加安装源#2.3 安装kubelet、kubectl、kubeadmin#2.4 安装master#2.5 安装网络插件 set -e # 安装日志install_log=/var/log/install_k8s.logtm=$(date +'%Y%m%d %T') # 日志颜色COLOR_G="\x1b[0;32m" # greenRESET="\x1b[0m" function info(){ echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"} function run_cmd(){ sh -c "$1 | $(tee -a "$install_log")"} function run_function(){ $1 | tee -a "$install_log"} function install_docker(){ info "1.使用脚本自动安装docker..." wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo yum install docker-ce info "2.启动 Docker CE..." sudo systemctl enable docker sudo systemctl start docker info "3.添加镜像加速器..." if [ ! -f "/etc/docker/daemon.json" ];then touch /etc/docker/daemon.json fi cat <<EOF > /etc/docker/daemon.json{ "registry-mirrors": [ "https://5ajk0rns.mirror.aliyuncs.com" ]}EOF info "4.重新启动服务..." sudo systemctl daemon-reload sudo systemctl restart docker info "5.测试 Docker 是否安装正确..." docker run hello-world info "6.检测..." docker info read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose if [[ "$is_compose" == 'yes' ]];then info "7.安装docker-compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose # 8.验证是否安装成功 info "8.验证docker-compose是否安装成功..." docker-compose -v fi} function install_k8s() { info "初始化k8s部署环境..." init_env info "添加k8s安装源..." add_aliyun_repo info "安装kubelet kubeadmin kubectl..." install_kubelet_kubeadmin_kubectl info "安装kubernetes master..." yum -y install net-tools if [[ ! "$(ps aux | grep 'kubernetes' | grep -v 'grep')" ]];then kubeadmin_init else info "kubernetes master已经安装..." fi info "安装网络插件flannel..." install_flannel info "去污点..." kubectl taint nodes --all node-role.kubernetes.io/master-} # 初始化部署环境function init_env() { info "关闭防火墙" systemctl stop firewalld systemctl disable firewalld info "关闭selinux" sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config source /etc/selinux/config info "关闭swap(k8s禁止虚拟内存以提高性能)" swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab info "设置网桥参数" cat <<-EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF sysctl --system #生效 sysctl -w net.ipv4.ip_forward=1 info "时间同步" yum install ntpdate -y ntpdate time.windows.com} # 添加aliyun安装源function add_aliyun_repo() { cat > /etc/yum.repos.d/kubernetes.repo <<- EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF} function install_kubelet_kubeadmin_kubectl() { yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service info "确认kubelet kubeadmin kubectl是否安装成功" yum list installed | grep kubelet yum list installed | grep kubeadm yum list installed | grep kubectl kubelet --version} function kubeadmin_init() { sleep 1 read -p "请输入master ip地址:" ip kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p "$HOME"/.kube sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config} function install_flannel() { yum -y install wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml} # 安装dockerread -p "是否安装docker?默认为:no. Enter [yes/no]:" is_dockerif [[ "$is_docker" == 'yes' ]];then run_function "install_docker"fi # 安装k8sread -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8sif [[ "$is_k8s" == 'yes' ]];then run_function "install_k8s"fi2.node节点安装脚本:install_k8s_node.sh#!/bin/bash# Kubernetes部署环境要求:#(1)一台或多台机器,操作系统CentOS 7.x-86_x64#(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+;#(3)集群内各个机器之间能相互通信;#(4)集群内各个机器可以访问外网,需要拉取镜像;#(5)禁止swap分区; # 安装步骤#1. 安装docker#1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose##2. 安装k8s#2.1 初始化环境#2.2 添加安装源#2.3 安装kubelet、kubectl、kubeadmin#2.4 安装master#2.5 安装网络插件 set -e # 安装日志install_log=/var/log/install_k8s.logtm=$(date +'%Y%m%d %T') # 日志颜色COLOR_G="\x1b[0;32m" # greenRESET="\x1b[0m" function info(){ echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}"} function run_cmd(){ sh -c "$1 | $(tee -a "$install_log")"} function run_function(){ $1 | tee -a "$install_log"} function install_docker(){ info "1.使用脚本自动安装docker..." wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com:443/use-framework-upgrade/docker-ce.repo yum install docker-ce info "2.启动 Docker CE..." sudo systemctl enable docker sudo systemctl start docker info "3.添加镜像加速器..." if [ ! -f "/etc/docker/daemon.json" ];then touch /etc/docker/daemon.json fi cat <<EOF > /etc/docker/daemon.json{ "registry-mirrors": [ "https://5ajk0rns.mirror.aliyuncs.com" ]}EOF info "4.重新启动服务..." sudo systemctl daemon-reload sudo systemctl restart docker info "5.测试 Docker 是否安装正确..." docker run hello-world info "6.检测..." docker info read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose if [[ "$is_compose" == 'yes' ]];then info "7.安装docker-compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose # 8.验证是否安装成功 info "8.验证docker-compose是否安装成功..." docker-compose -v fi} function install_k8s() { info "初始化k8s部署环境..." init_env info "添加k8s安装源..." add_aliyun_repo info "安装kubelet kubeadmin kubectl..." install_kubelet_kubeadmin_kubectl} # 初始化部署环境function init_env() { info "关闭防火墙" systemctl stop firewalld systemctl disable firewalld info "关闭selinux" sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config source /etc/selinux/config info "关闭swap(k8s禁止虚拟内存以提高性能)" swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab info "设置网桥参数" cat <<-EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF sysctl --system #生效 sysctl -w net.ipv4.ip_forward=1 info "时间同步" yum install ntpdate -y ntpdate time.windows.com} # 添加aliyun安装源function add_aliyun_repo() { cat > /etc/yum.repos.d/kubernetes.repo <<- EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF} function install_kubelet_kubeadmin_kubectl() { yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service info "确认kubelet kubeadmin kubectl是否安装成功" yum list installed | grep kubelet yum list installed | grep kubeadm yum list installed | grep kubectl kubelet --version} function kubeadmin_init() { sleep 1 read -p "请输入master ip地址:" ip kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p "$HOME"/.kube sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config} function install_flannel() { yum -y install wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml} # 安装dockerread -p "是否安装docker?默认为:no. Enter [yes/no]:" is_dockerif [[ "$is_docker" == 'yes' ]];then run_function "install_docker"fi # 安装k8sread -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8sif [[ "$is_k8s" == 'yes' ]];then run_function "install_k8s"fi3.安装完成master节点后会提示加入节点的命令类似这样[addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.0.174:6443 --token 861suk.4xhcuycoev4rh6dm \ --discovery-token-ca-cert-hash sha256:3fabddc90d0966bef569865236913b93fe12ee2429f957718f2485447564 [20230508 13:48:36] [Info] 安装网络插件flannel...在各个node节点上执行命令即可kubeadm join 192.168.0.174:6443 --token 861suk.4xhcuycoev4rh6dm \ --discovery-token-ca-cert-hash sha256:3fabddc90d0966bef569865236913b93fe12ee2429f957718f2485447564  安装验证  验证docker是否安装成功docker -v 验证docker-compose是否安装成功docker-compose -v 验证k8s是否安装成功kubectl get nodes 脚本中已经做了去污点[通过kubeadmin部署k8s,默认master上是不能被调度pod的,去污点就是在master上也可以被调度pod] 等待一会后,再通过kubectl get nodes查看,master状态已经正常了 
  • 使用kubeadm初始化k8s集群遇到问题
    我在尝试部署KubeEdge框架在部署K8s使用 kubeadm init语句初始化集群时遇到了问题使用的Ubuntu版本为18.04Docker版本为18.06.3Kubernetes版本为1.17.4遇到的如下的报错起先是卡在这个位置按照网络上的教学修改了kubelet与Docker的驱动程序改为systemd然后就出现了上面那张图的报错求教错误原因与解决的方案
  • 轻松玩转Kubernetes笔记分享
    Kubernetes概述什么是容器?·容器为App提供独立的、受控的运行环境,是一种轻量级的操作系统虚拟化。简单的容器:SandBox(沙盒、沙箱)容器基本概念·容器关键概念―容器一镜像容器关键技术CgroupNameSpace容器时代的“双城记”Docker Kubernetes(K8s)Kubernetes -大海航行的舵手K8s集群主要包括两个部分:Master节点(管理节点)和Node节点(计算节点)Master节点主要还是负责管理和控制。Node节点是工作负载节点,里面是具体的容器。Master节点Master节点提供的集群控制,对集群做出全局性决策,例如调度等。通常在master节点上不运行用户容器。Master节点包括API Server、Scheduler、Controller manager、etcd。API Server :整个系统的对外接口Scheduler:集群内部的资源进行调度Controller Manager:负责管理控制器etcd : Kubernetes的后端存储Node节点节点组件运行在每一个Node节点上,维护运行的pod并提供kubernetes运行时环境。Node节点包括Pod、Docker、kubelet、kube-proxy、Fluentd、kube-dns (可选Pod是K8s最小单位Pod : Kubernetes最基本的操作单元Docker :创建容器;Kubelet:负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等;Kube-proxy∶负责为Pod对象提供代理Fluentd:主要负责日志收集、存储与查询。Master节点和Node节点交互Kubernetes云上环境搭建CCE-基于开源K8S、 Docker技术的企业级容器服务云容器引擎(Cloud Container Engine,CCE)是基于业界主流的Docker和Kubernetes开源技术构建的容器服务,提供众多契合企业大规模容器集群场景的功能,在系统可靠性、高性能、开源社区兼容性等多个方面具有独特的优势,满足企业在构建容器云方面的各种需求。CCE优势:高性能、简单易用、安全可靠、开放兼容怎么管理K8s集群图形化WEB-UI 华为云CCE控制台、官方Dashboard命令行Kubectl iWebTerminal 管理员并发用户少Node+EIP 管理员并发用户多华为云Kubernetes环境快速搭建架构CE快该束物建KubernetesKubernetes的访问VPC:提供网络环境EIP:访问公网ECS:弹性云主机CCE:创建K8s集群Kubernetes环境管理进行Kubectl及配置文件下载下载kubectl和kubectl配置文件 kubeconfig.json和kubectlKubectl客户端服务器购买集群中管理节点安全组设置安装和使用kubectl使用Kubernetes只需一个部署文件,使用一条命令就可以部署多层容器(前端,后台等)的完整集群:$kubectl create -f single-config-file.yamlkubectl是和Kubernetes API交互的命令行程序。1.3 Kubernetes核心概念Kubernetes最小管理单元-PODPod是Kubernetes管理的最小基础单元。一个Pod中封装了︰一个或多个紧耦合的应用容器存储资源独立的IP容器运行的选项相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器可以很容易地与其他容器在相同的容器中进行通信实践1:POD的创建和管理1.POD定义文件的上传通过winscp将下载的附件中的yml文件上传至客户端服务器目录并查看;2.创建PODkubectl apply -f POD-1Containeryml3.POD的管理指定POD运行到指定的NODE上kubectl apply -f POD-NodeSelector.yml4.POD的删除kubectl get podkubectl delete pod nginx有状态应用和无状态应用无有状态应用无状态服务,易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别;可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。有状态应用有状态的服务,从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大;每个运行的应用程序都至少有—个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。无状态应用控制器– DeploymentReplicationController 无状态应用的高可靠 ReplicaSets 无状态应用的高可靠应用的滚动发布 Deployment实践2:Deployment的创建和管理1.创建deploymentkubectl apply -f deployment.yml2.查看PODkubectl get pod3.手动删除PODkubbectl delete pod nginx-deployment-67d4b848b4-sghfq4.扩展Deployment数量kubectl scale deployment.v1.apps/nginx-deployment --replicas=4kubectl get pod5.查看deployment状态和数量有状态应用控制器- StatefulSet如果部署的应用满足右侧一个或多个部署需求则建议使用StatefulSet。在具有以下特点时使用StatefulSets·稳定性,唯一的网络标识符·稳定性,持久化存储·有序的部署和扩展·有序的删除和终止·有序的自动滚动更新实践3:StatefulSet的创建和管理1.在Winscp将StatefulSet定义文件statefulset.yml上传至ecs-k8s。2.通过以下命令创建StatefulSet。kubetcl apply -f statefulset.yml3.通过以下命令查看POD数量和名称kubectl get pod4.手动删除名称为web-0的POD。kubectl delete pod web-05.再次查看POD。kubectl get pod系统应用控制器- DaemonSetDaemonSet能够让所有或者特定的Node节点运行一个pod。当节点加入到kubernetes集群中,pod会被( DaemonSet ) 调度到该节点上运行。当节点从kubernetes集群中被移除,( DaemonSet )调度的pod会被移除。运行日志采集器在每个Node上,例如fluentd ,logstash运行监控的采集端在每个Node,例如prometheusnode exporter , collectd等每个Node上运行一个分布式存储的守护进程,例如glusterd , ceph适合场景:在一个区域的Node上都运行一个守护进程实践4:DaemonSet的创建和管理在winscp中上传daemonset.yml文件至ecs-k8s查看kube-system命令空间中的DaemonSetkubectl get ds -n kube-system创建daemonsetkubectl apply -f daemonset.yml4.再次查看kube-system中的DaemonSetkubectl get ds -n kube-system5.在CCE中购买节点6.查看各个DaemonSet实例数kubectl get ds -n kube-system临时任务控制器–Job我们经常需要进行批量数据处理和分析,以及按照时间进行调度执行。可以在Kubenrtes中使用容器技术完成,使用Job和CronJob来执行。Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。CronJob是基于调度的Job执行将会自动产生多个job,调度格式参考Linux的cron系统。实践5:Jobs创建和管理winscp将Job.yml上传运行Jobkubectl apply -f Job. Yml3.查看job运行状态kubectl get job4.查看此Job的输出kubectl get podkubectl logs pi-c5pgr应用访问- ServiceKubernetes应用间互访- Cluster IPKubernetes集群外互访–NodePort公网访问- LoadBalancer实践6 : Service的创建和管理1.上传的deployment文件创建Deploymentkubectl apply -f deployment. Yml2.创建NodePort类型的Service并查看kubectl expose deployment nginx-deployment-type=NodePortkubectl get service通过curl命令验证网站kubectl get node4.url 192.168.0.227:324655.华为云控制台查看其中一个kubernetes Node绑定的公网地址6.在浏览器中,输入ECS绑定的公网地址+Service的Nodeport命名空间- NameSpace作用:Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群;Namespace为名称提供了一个范围。资源的Names在Namespace中具有唯一性场景:当团队或项目中具有许多用户时,可以考虑使用Namespace来区分,a如果是少量用户集群,可以不需要考虑使用Namespace,如果需要它们提供特殊性质时,可以开始使用Namespace。大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是3个:default:你的service和app默认被创建于此。kube-system : kubernetes系统组件使用。kube-public :公共资源使用。实践7∶命名空间的创建和管理默认的Nama&pice实践手动的创建一个NameSpace命名空间并查看kubectl create namespace testkubectl get namespace2.创建一个POD并指定此POD运行在test命名空间llkubectl apply-f POD-1Container.yml -namespace=test3.查看指定命名空间里的PODkubectl get pod -n test.创建一个限制CPU和内存大小的NameSpacekubectl create -f ns-cpu-men.yml -namespace=quota-mem-cpu-examplekubectl get resourcequota mem-cpu-demo -namespace=quota-mem-cpu-example R--output=yaml
  • [技术干货] 您好,鲲鹏centos8.4安装k8s,docker的时候启动报错
    您好,我在安k8s前尝试安装docker10.20.7之后写入配置文件,然后重启的时候报错配置文件:[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.target docker.socket[Service]Type=notifyEnvironmentFile=-/run/flannel/dockerWorkingDirectory=/usr/local/binExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock --selinux-enabled=false --log-opt max-size=1gExecReload=/bin/kill -s HUP $MAINPID# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Uncomment TasksMax if your systemd version supports it.# Only systemd 226 and above support this version.#TasksMax=infinityTimeoutStartSec=0# set delegate yes so that systemd does not reset the cgroups of docker containersDelegate=yes# kill only the docker process, not all processes in the cgroupKillMode=processRestart=on-failure[Install]WantedBy=multi-user.targetrestart后报错:[drm:virtio_gpu_dequeue_ctrl_func [virtio_gpu]] ERROR response 0x1202 (command 0x103)6月 25 19:09:19 ecs-formal-0002 kernel: virtio_gpu_dequeue_ctrl_func: 24 callbacks suppressed6月 25 19:09:19 ecs-formal-0002 kernel: [drm:virtio_gpu_dequeue_ctrl_func [virtio_gpu]] ERROR response 0x1202不知道什么问题,烦请解答,谢谢!
  • [技术干货] K8S集群添加节点报错
    问题现象集群添加节点的时候报错提示:unable to fetch kubeadm-config问题原因一般在这个环节出现添加错误并提示没有权限获取config文件,大多是由于token错误或者失效造成的,由于默认情况下master节点上的token只会保留24小时,超过期限之后会失效。处理步骤  步骤1去master节点上检查token状态:  kubeadm token list  步骤2如果发现已经invalid则需要重新生成一个临时token(这里暂时不讨论生成长期有效的token)执行:  kubeadm create token  步骤3  使用新的token执行添加操作即可通过 
  • [技术干货] K8S网络管理组件calico问题排查
    背景项目中的系统要求使用如下软件栈:l  UOS 20 Enterprise sp2l  Javal  Mysqll  Redisl  Kafkal  Dockerl  Kubernetes问题POD中的容器无法正常通信,网络通信故障表现如下:问题分析项目K8S使用的calico组件管理网络,Calico 是一个纯三层的协议,为 OpenStack 虚机和 Docker 容器提供多主机间通信。Calico 不使用重叠网络比如 flannel 和 libnetwork 重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。Calico 依赖 etcd 在不同主机间共享和交换信息,存储 Calico 网络状态。Calico 网络中每个主机都要运行 Calico 组件,提供容器 interface 管理,动态路由,动态 ACL,报告状态等功能。基于上图的通信故障,定位问题发生跨POD的通信规则上。l  首先排查calico网络配置,客户的系统calico使用BGC协议管理网路规则,Calico引入这个BGP,它是将每个node,都做成一个虚拟路由器,他们通过BGP实现相互路由信息的交换,而flannel是由一个守护进程维护的每个路由表,发送到本地的节点,而calico采用的是BGP来实现数据交换,但路由表也要写到每个节点上。查看calico的配置参数为发现异常。l  然后在node和POD上排查路由列表,路由表也是正常的。l  最后排查iptables规则,因为calico的流量隔离是基于iptables实现的,并且从etcd中获取需要生成的隔离规则。最终定位iptables规则的问题。Calico使用OS自带的iptables生成路由规则,保证节点间、POD间通信。UOS上iptables升级到了1.8.2,后端从Legacy模式变成了nf_tables。这两种模式的区别不在此赘述,简单来说就是calico无法适配高版本的iptables,无法在Host上产生正确的路由规则。在社区上的方案方案并没有为适配nf_tables另外实现路由规则的建立,而是重用了legacy模式的逻辑,先产生legacy模式的路由规则,再使用iptables-nft-save和iptables-nft-restore命令分别导出及写入到host的iptables中。解决办法更换calico的网络模式,从BGP模式更换成IPIP,IPIP就是把一个IP数据包又套在一个IP包里,即把 IP 层封装到 IP 层的一个 tunnel,它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。操作步骤Calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成“Always”,即可!
总条数:27 到第
上滑加载中