kubeadm部署安装k8s集群

Kubernetes组件介绍

k8s master包含的三大组件

  • kube-apiserver,是整个 Kubernetes 集群的“灵魂”,是信息的汇聚中枢,提供了所有内部和外部的 API 请求操作的唯一入口。同时也负责整个集群的认证、授权、访问控制、服务发现等能力。
  • Kube-Controller-Manager,负责维护整个 Kubernetes 集群的状态,比如多副本创建、滚动更新等。Kube-controller-manager 并不是一个单一组件,内部包含了一组资源控制器,在启动的时候,会通过 goroutine 拉起多个资源控制器。这些控制器的逻辑仅依赖于当前状态,因为在分布式系统中没办法保证全局状态的同步。
  • Kube-scheduler,监听未调度的 Pod,按照预定的调度策略绑定到满足条件的节点上。这个工作虽说看起来是三大件中最简单的,但是做的事情可一点不少。

k8s node节点包含以下组件

  • Container Runtime,容器运行时主要负责容器的镜像管理以及容器创建及运行。大家都知道的 Docker 就是很常用的容器,此外还有 Kata、Frakti等。只要符合 CRI(Container Runtime Interface,容器运行时接口)规范的运行时,都可以在 Kubernetes 中使用。
  • Kubelet,责维护 Pod 的生命周期,比如创建和删除 Pod 对应的容器。同时也负责存储和网络的管理。一般会配合 CSI、CNI 插件一起工作。
  • Kube-Proxy,主要负责 Kubernetes 内部的服务通信,在主机上维护网络规则并提供转发及负载均衡能力。

除了上述核心组件,通常会在k8s中部署一些Add-on组件,常见的有

  • CoreDNS 负责为整个集群提供 DNS 服务。
  • Ingress Controller 为服务提供外网接入能力。
  • Dashboard 提供 GUI 可视化界面。
  • Fluentd + Elasticsearch 为集群提供日志采集、存储与查询等能力。

kubelet、kubeadm、kubectl 介绍

  • kubeadm,用于初始化k8s集群。
  • kubectl,是k8s命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。
  • kubelet,运行在cluster所有节点上,负责启动pod和容器。

使用kubeadm部署k8s测试集群

官方给的centos配置

  • 操作系统,centos7

  • 最少CPU,4核

  • 最小内存,4GB

  • Swap,Disabled

  • 最小磁盘,100GB

  • 三台CentOS7.9测试机(kernel-3.10.0)

172.16.208.249 mrms-test01 --master
172.16.208.250 mrms-test02  -- nodes
172.16.210.19 mrms-test03  --nodes
  • 三台主机加入hosts信息
cat /etc/hosts
172.16.208.249 mrms-test01
172.16.208.250 mrms-test02
172.16.210.19 mrms-test03
  • Disable SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  • Disable Swap
swapoff -a
  • Bridging Container traffics
lsmod | grep br_netfilter #确认是否有加载此模块
sudo modprobe br_netfilter  #没有的话可以先加载

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
  • Check Required Ports
#防火墙开放以下端口
#control-plane node(s)
Protocol Direction  PortRange  Purpose                    UsedBy
TCP	     Inbound	6443*	   Kubernetes API server	  All
TCP	     Inbound	2379-2380  etcd server client API	  kube-apiserver, etcd
TCP	     Inbound	10250	   Kubelet API	Self, Control plane
TCP	     Inbound	10251	   kube-scheduler	          Self
TCP	     Inbound	10252	   kube-controller-manager	  Self

#worker node(s)
TCP	     Inbound	10250	   Kubelet API	              Self, Control plane
TCP	     Inbound	30000-32767 NodePort Services†	      All
  • Install Docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo   https://download.docker.com/linux/centos/docker-ce.repo
sudo yum update -y && sudo yum install -y   containerd.io-1.2.13   docker-ce-19.03.11   docker-ce-cli-19.03.11
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
  • Adding Repositories
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet

#Notes kubelet现在每隔几秒就会重启一次,因为还没创建集群,它在等待kubeadm告诉它怎么做
  • Initialize the kubernetes Cluster
#如果master 节点有多块网卡,可以通过参数 apiserver-advertise-address 来指定你想要暴露的服务地址
kubeadm init --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=172.16.208.249

#运行完成后,会出现下面这些信息告诉你安装成功,以及一些常规指令
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:
  /docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  • Copy the configuration file under user home and change the require ownership
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • Creating Pod Networks
#安装网络插件
wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
wget https://docs.projectcalico.org/v3.10/manifests/calico.yaml

kubectl apply -f rbac-kdd.yaml
kubectl apply -f calico.yaml
  • Join Nodes to the Cluster
kubeadm join 172.16.208.249:6443 --token 1qujn8.yqqx3t65qdcr66rr --discovery-token-ca-cert-hash sha256:xxxxxxxxxx
  • Verify the Cluster
[root@mrms-test01 user00]# kubectl get nodes
NAME          STATUS   ROLES                  AGE     VERSION
mrms-test01   Ready    control-plane,master   6d18h   v1.20.0
mrms-test02   Ready    <none>                 6d18h   v1.20.0
mrms-test03   Ready    <none>                 6d18h   v1.20.0

[root@mrms-test01 user00]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7854b85cf7-9xdh7   1/1     Running   0          18h
calico-node-55chv                          1/1     Running   0          18h
calico-node-nfzvl                          1/1     Running   0          18h
calico-node-p4czz                          1/1     Running   0          18h
coredns-74ff55c5b-6vw7l                    1/1     Running   0          6d18h
coredns-74ff55c5b-bg67j                    1/1     Running   0          6d18h
etcd-mrms-test01                           1/1     Running   0          6d18h
kube-apiserver-mrms-test01                 1/1     Running   0          6d18h
kube-controller-manager-mrms-test01        1/1     Running   0          6d18h
kube-proxy-qhfgc                           1/1     Running   0          6d18h
kube-proxy-wqjtb                           1/1     Running   0          6d18h
kube-proxy-ws75f                           1/1     Running   0          6d18h
kube-scheduler-mrms-test01                 1/1     Running   0          6d18h
  • 一个 Pod 的真实例子
apiVersion: v1 #指定当前描述文件遵循v1版本的Kubernetes API
kind: Pod #我们在描述一个pod
metadata:
  name: twocontainers #指定pod的名称
  namespace: default #指定当前描述的pod所在的命名空间
  labels: #指定pod标签
    app: twocontainers
  annotations: #指定pod注释
    version: v0.5.0
    releasedBy: david
    purpose: demo
spec:
  containers:
 - name: sise #容器的名称
    image: quay.io/openshiftlabs/simpleservice:0.5.0 #创建容器所使用的镜像
    ports:
    - containerPort: 9876 #应用监听的端口
 - name: shell #容器的名称
    image: centos:7 #创建容器所使用的镜像
    command: #容器启动命令
      - "bin/bash"
      - "-c"
      - "sleep 10000"
  • 通过kubectl 命令在集群中创建这个 Pod
kubectl create -f ./twocontainers.yaml
##创建出来后,稍微等待一下,我们就可以看到,该 Pod 已经运行成功了
[root@mrms-test01 user00]# kubectl get pods
NAME            READY   STATUS    RESTARTS   AGE
twocontainers   2/2     Running   6          3d23h

#通过 exec 进入shell这个容器,来访问sise服务:
[root@mrms-test01 ~]# kubectl exec twocontainers -c shell -i -t -- bash
[root@twocontainers /]# curl -s localhost:9876/info
{"host": "localhost:9876", "version": "0.5.0", "from": "127.0.0.1"}[root@twocontainers /]# 
[root@twocontainers /]# exit

以上就是通过kubeadm搭建一个k8s测试集群的步骤,因为我用的是海外机器搭建的,所以上面用到的都是海外仓库直接部署工具了,如果是用国内机器,需要修改对应的仓库源地址。
参考地址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://www.linuxsysadmins.com/how-to-install-a-kubernetes-on-centos-7/

上一篇:eNSP启动防火墙USG6000V - 显示the device is running###解决方法


下一篇:Kubernetes Logs 如何获取kube-system pod的日志