#云原生征文#kubeadm部署一主两从的kubernetes集群 原创 精华

发布于 2022-5-31 23:30
浏览
1收藏

kubernetes集群大体上分为两类:一主多从和多主多从。

一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
多主多从:多台Master节点和多台Node节点,搭建麻烦,适合用于生产环境

本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子

一、禁用swap分区

swapoff -a

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用
启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭

vim /etc/fstab

注释掉最后一行
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

二、安装docker(三个节点)

1.切换镜像源

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2.查看前镜像源中支持的docker版本

yum list docker-ce --showduplicates

3.安装指定版本docker(带上–setopt=obsoletes=0,使用指定版本)

yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

4.添加配置文件

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

5.启动docker

systemctl restart docker
systemctl enable docker

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

三、安装kubernetes组件(三个节点)

1.配置镜像源

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2.安装指定版本的kubeadm,kubelet和kubectl

yum install --setopt=obsoletes=0 kubeadm-1.23.6-0 kubelet-1.23.6-0 kubectl-1.23.6-0 -y

3.修改/etc/sysconfig/kubelet的内容,将里边内容替换

vim /etc/sysconfig/kubelet

KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4.设置kubelet开机自启

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部署一主两从的kubernetes集群-开源基础软件社区

五、集群初始化(主节点)

1.主节点创建集群

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部署一主两从的kubernetes集群-开源基础软件社区
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

如果初始化失败了,使用如下命令清理环境,并重新初始化
kubeadm reset
rm -rf $HOME/.kube
systemctl restart kubelet

2.创建必要文件

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

在两个备机执行改语句,加入集群,结果如下:

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。

kubectl get nodes

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

七、安装网络插件——calico

kubernetes支持多种网络插件,比如flannel、calica、canal等等,任选一种使用即可,本次选择calico。
网络插件没有安装的话,节点是 <font color=“#dd00dd”>NotReady</font> 状态,因为CoreDNS没有网络插件分配不到IP地址,会一直处于Pending状态
如果没有这个插件,kubedns无法启动,pod之间就无法通信。
<font color=“#dd00dd”>只在主节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。</font><br />

1.获取配置文件并apply

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2.查看服务状态,都是running了

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

再次查看节点状态,发现所有的节点都是 <font color=“#dd00dd”>Ready</font> 的状态了
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

八、部署CoreDNS

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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。

kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
等待一会后查看events,发现终于拉取成功了
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
查看pod和svc状态,都是running的

kubectl get pod,svc -A

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

九、kubernetes-dashboard的部署

1.获取yaml文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2.增加配置,使Dashboard暴露到外部

vim recommended.yaml

因为默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

3.apply修改后的recommended.yaml

kubectl apply -f recommended.yaml

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4.查看kubernetes-dashboard的pod状态,都已经是running的

kubectl get pods -n kubernetes-dashboard

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

5.访问网址

https://NodeIP:30001
我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

6.创建service account并绑定默认cluster-admin管理员集群角色:

创建用户

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}')

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

7.使用输出的token登录Dashboard。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
可以查看当前k8s的相关信息,例如nodes,namespace等
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

十、使用k8s简单部署一个nginx

1.根据yaml创建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

2.创建pod

一般不直接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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
nginx-deployment 部署的2个 pod 全部成功

查看两个nginx分配的ip

kubectl get pods -o wide -n ns-test

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

访问测试

curl http://10.0.181.5

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

3.创建service

创建对应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

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

访问测试
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4.暴露端口部署nginx服务

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

测试如下
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

【本文正在参加云原生有奖征文活动】,活动链接:https://ost.51cto.com/posts/12598”

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
1
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐