kubernetes集群大体上分为两类:一主多从和多主多从。
一主多从:一台Master节点和多态Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
多主多从:多台Master节点和多态Node节点,搭建麻烦,适合用于生产环境
本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子
swapoff -a
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用
启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭
vim /etc/fstab
注释掉最后一行

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum list docker-ce --showduplicates
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

systemctl restart docker systemctl enable docker

vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyum.com/kubernetes/yum/doc/rpm-package-key.gpg

yum install --setopt=obsoletes=0 kubeadm-1.23.6-0 kubelet-1.23.6-0 kubectl-1.23.6-0 -y
vim /etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"

systemctl enable kubelet
这步是为第五步的kubeadm init做准备,因为init会拉取镜像,而此镜像在kubernetes的仓库中,由于网络原因,无法连接,因此用如下方法
vim ima.sh
添加内容
images=(
kube-apiserver:v1.23.6
kube-controller-manager:v1.23.6
kube-scheduler:v1.23.6
kube-proxy:v1.23.6
pause:3.6
etcd:3.5.1-0
coredns:v1.8.6
)
for list in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$list
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$list k8s.gcr.io/$list
done
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
sh ima.sh

kubeadm init \ --kubernetes-version=v1.23.6 \ --pod-network-cidr=10.0.0.0/16 \ --service-cidr=10.0.0.0/12 \ --apiserver-advertise-address=172.20.10.6

记录下最后结尾的几个命令

如果初始化失败了,使用如下命令清理环境,并重新初始化
kubeadm reset
rm -rf $HOME/.kube
systemctl restart kubelet
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
使用kubeadm init 结尾提示的kubeadm join语句初始化备机,如果忘记kubeadm join语句可以通过如下命令在主节点获取join命令参数:
kubeadm token create --print-join-command

在两个备机执行改语句,加入集群,结果如下:
提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。
kubectl get nodes

kubernetes支持多种网络插件,比如flannel、calica、canal等等,任选一种使用即可,本次选择calico。
网络插件没有安装的话,节点是
NotReady 状态,因为CoreDNS没有网络插件分配不到IP地址,会一直处于Pending状态
如果没有这个插件,kubedns无法启动,pod之间就无法通信。
只在主节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O


再次查看节点状态,发现所有的节点都是
Ready 的状态了

git clone https://github.com/coredns/deployment.git yum -y install epel-release yum -y install jq cd deployment/kubernetes/ ./deploy.sh -i 10.0.0.254 > coredns.yaml kubectl apply -f coredns.yaml
用命令查看状态,发现pod处于ContainerCreating状态
kubectl get pod,svc -A
使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。
kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system
等待一会后查看events,发现终于拉取成功了
查看pod和svc状态,都是running的
kubectl get pod,svc -A

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
vim recommended.yaml
因为默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

kubectl apply -f recommended.yaml

kubectl get pods -n kubernetes-dashboard

https://NodeIP:30001
我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001

创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

可以查看当前k8s的相关信息,例如nodes,namespace等


vim nginx-namespace.yaml 内容如下 apiVersion: v1 #类型为Namespace kind: Namespace #类型为Namespace metadata: name: ns-test #命名空间名称 labels: name: label-test #pod标签
创建namespace
[root@pg01 ~]# kubectl create -f nginx-namespace.yaml namespace/ns-test created
查询namespace
[root@pg01 ~]# kubectl get namespace NAME STATUS AGE default Active 92m kube-node-lease Active 92m kube-public Active 92m kube-system Active 92m kubernetes-dashboard Active 21m ns-test Active 5s
一般不直接create pod,而是通过controller来创建pod。deployment为其中一种controller
拉取nginx镜像
docker pull nginx
编辑pod的yaml文件
vim nginx-deployment.yaml
内容如下
apiVersion: apps/v1 kind: Deployment metadata: namespace: ns-test name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
创建
kubectl create -f nginx-deployment.yaml
查询
kubectl get pods -n ns-test kubectl get deployment -n ns-test
nginx-deployment 部署的2个 pod 全部成功
查看两个nginx分配的ip
kubectl get pods -o wide -n ns-test

访问测试
curl http://10.0.181.5

创建对应yaml文件
vim nginx-service.yaml
内容如下
apiVersion: v1 kind: Service metadata: namespace: ns-test name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80
创建service
kubectl create -f nginx-service.yaml
查看service
kubectl get svc nginx-service -o wide -n ns-tes

访问测试

nginx-service.yaml文件如下
apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx-service namespace: ns-test spec: ports: - port: 9000 name: nginx-service protocol: TCP targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了 nodePort: 31090 #外网访问的端口 selector: app: nginx type: NodePort
部署服务
kubectl create -f nginx-service.yaml
查看服务和端口
kubectl get svc nginx-service -n ns-test
测试如下

浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69990629/viewspace-2895114/ ,如需转载,请注明出处,否则将追究法律责任。