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/