优点: 安装,配置很简单,适合新手学习。 缺点: 不能定制安装。
kind安装: kind让你能够在本地计算机上运行Kubernetes。 kind要求你安装并配置好Docker。 推荐阅读:
minikube是一个工具, 能让你在本地运行Kubernetes。 minikube在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的Kubernetes集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。因此很适合开发人员体验K8S。 推荐阅读:
你可以使用kubeadm工具来创建和管理Kubernetes集群,适合在生产环境部署。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。 推荐阅读: 推荐阅读 推荐阅读
安装步骤比较繁琐,但可以更加了解细节。适合运维人员生产环境中使用。
难度最大,请做好各种故障排查的心理准备。其实这样一点对于K8S二次开发的人员应该不是很难。 2.kubectl时kubernetes集群的命令行工具 kubectl使得你可以对Kubernetes集群运行命令。 你可以使用kubectl来部署应用、监测和管理集群资源以及查看日志。 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
大规模注意事项
https://kubernetes.io/zh-cn/docs/setup/best-practices/cluster-large/
注意
所有机器上都要做的操作
yum install -y ntp service ntpd start
swapoff -a && sysctl -w vm.swappiness=0 #临时禁用交换分区
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab #永久禁用交换分区 cat /etc/fstab
ifconfig eth0 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid
简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。
#| tee #往文件里面追加内容
cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat > /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system # 生效 modprobe br_netfilter #加载网桥过滤器模块 lsmod | grep br_netfilter # 验证是否生效
在kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs,两者对比ipvs的性能要高,如果想要使用ipvs模型,需要手动载入ipvs模块
yum -y install ipvsadm ipset #没有加载成功则手动执行 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 source /etc/sysconfig/modules/ipvs.modules systemctl enable --now systemd-modules-load.service # 验证ipvs模块 lsmod | grep -e ip_vs -e nf_conntrack_ipv4
systemctl disable --now firewalld echo 1 >/proc/sys/net/ipv4/ip_forward #proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config grep ^SELINUX= /etc/selinux/config
根据自己环境改
cat >> /etc/hosts <<'EOF' 10.0.0.151 k8s151.com 10.0.0.152 k8s152.com 10.0.0.153 k8s153.com 10.0.0.154 k8s154.com EOF cat /etc/hosts # 验证结果
部署Containerd(推荐工作用)
相关信息
k8s使用containerd 1、需要containerd 2、需要runc环境 3、需要cni网络接口 注:containerd默认不会自带runc(真正创建容器的程序),所以需要安装runc程序,以及cni网络插件(容器之间网络通信所需)。
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list | grep containerd
yum -y install containerd.io
rpm -qa | grep containerd
runc -v systemctl enable --now containerd systemctl restart containerd
官方下载地址 https://github.com/containerd/containerd/releases
#------containerd------ wget https://github.com/containerd/containerd/releases/download/v1.7.18/cri-containerd-cni-1.7.18-linux-amd64.tar.gz tar xf cri-containerd-cni-1.7.18-linux-amd64.tar.gz -C / #----libseccomp准备----- wget https://github.com/opencontainers/runc/releases/download/v1.1.13/libseccomp-2.5.5.tar.gz tar xf libseccomp-2.5.5.tar.gz cd libseccomp-2.5.5/ yum install gperf -y ./configure make && make install #------runc准备----- wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64 chmod +x runc.amd64 #替换containerd安装已安装的runc mv runc.amd64 /usr/local/sbin/runc #执行runc命令 runc -v
输出结果
[root@master01 ~]$ runc -v runc version 1.1.13 commit: v1.1.13-0-g58aa9203-dirty spec: 1.0.2-dev go: go1.21.11 libseccomp: 2.5.5 [root@master01 ~]$
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml #修改配置文件,主要修改以下配置: vim /etc/containerd/config.toml .... 61 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" #修改沙箱镜像pause为国内镜像 125 SystemdCgroup = true #设置驱动为system # 设置拉去镜像地址为aliyun镜像地址 # registry.cn-hangzhou.aliyuncs.com sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/a\ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n endpoint = ["https://8aj710su.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]' /etc/containerd/config.toml systemctl daemon-reload systemctl restart containerd
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch/ 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
这个时候应该会报错,不报错更好,yum问题,直接去看解决方案 http://115.29.205.107/post/19
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
yum -y list kubeadm --showduplicates | sort -r [root@master01 ~]$ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"} [root@master01 ~]$ kubelet --version Kubernetes v1.28.2 [root@master01 ~]$
systemctl enable --now kubelet && systemctl status kubelet
mkdir k8s-rpm && find /var/cache/yum -name "*.rpm" | xargs mv -t k8s-rpm
只需要在主节点操作
-------使用containerd的容器运行时------ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.27.0 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=10.0.0.151 --cri-socket unix:///var/run/containerd/containerd.sock 相关参数说明: --apiserver-advertise-address: 指定apiserver的地址,用于其他节点连接用的内网地址。 --kubernetes-version: 指定K8S master组件的版本号。 --image-repository: 指定下载k8s master组件的镜像仓库地址。 --pod-network-cidr: 指定Pod的网段地址。 --service-cidr: 指定SVC的网段 使用kubeadm初始化集群时,可能会出现如下的输出信息: [init] 使用初始化的K8S版本。 [preflight] 主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。 [certs] 生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。 [kubeconfig] 生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。 [kubelet-start] 启动kubelet, 环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env" 配置文件默认写入:"/var/lib/kubelet/config.yaml" [control-plane] 使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。 此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler" [etcd] 创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests" [wait-control-plane] 等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。 [apiclient] 等待所有的master组件正常运行。 [upload-config] 创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。 [kubelet] 创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置 [upload-certs] 跳过此节点,详情请参考”--upload-certs" [mark-control-plane] 标记控制面板,包括打标签和污点,目的是为了标记master节点。 [bootstrap-token] 创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。 如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。 [kubelet-finalize] 更新kubelet的证书文件信息 [addons] 添加附加组件,例如:"CoreDNS"和"kube-proxy”
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config #去除master的污点,不然不会被调度(一般master只是作为管理者,去除污点后就可以了) kubectl taint nodes --all node-role.kubernetes.io/control-plane-
[root@k8s151 ~]$ kubectl get no NAME STATUS ROLES AGE VERSION k8s151 NotReady master 4m34s v1.15.12 [root@k8s151 ~]$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} [root@k8s151 ~]$ kubectl get no,cs NAME STATUS ROLES AGE VERSION node/k8s151 NotReady master 5m47s v1.15.12 NAME STATUS MESSAGE ERROR componentstatus/scheduler Healthy ok componentstatus/controller-manager Healthy ok componentstatus/etcd-0 Healthy {"health":"true"}
在152和153上执行 kubeadm join 10.0.0.151:6443 --token a3fndb.oitexxftm0xpx90j \ --discovery-token-ca-cert-hash sha256:ef830cffbeb332ae329af30a9257fd7584e034d524bc5cb2cd6e9bcfe6307f10 节点都加入之后,查看一下 [root@k8s151 ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s151.oldboyedu.com NotReady master 10m v1.18.0 k8s152.oldboyedu.com NotReady <none> 60s v1.18.0 k8s153.oldboyedu.com NotReady <none> 38s v1.18.0
所有组件都 echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc # 安装bash-completion ## bash-completion-extras需要epelrepo源 yum install -y bash-completion bash-completion-extras # 配置自动补全 source /usr/share/bash-completion/bash_completion echo 'source <(kubectl completion bash)' >>~/.bashrc 如果 kubectl 有关联的别名,你可以扩展 shell 补全来适配此别名: echo 'alias k=kubectl' >>~/.bashrc echo 'complete -F __start_kubectl k' >>~/.bashrc 系统全局 kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null source ~/.bashrc