Kubeadm部署一主两从的Kubernetes集群-51CTO.COM
source link: https://www.51cto.com/article/710645.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
kubernetes集群大体上分为两类:一主多从和多主多从。
一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
多主多从:多台Master节点和多台Node节点,搭建麻烦,适合用于生产环境。
本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。
一、禁用swap分区
swapoff -a
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用。
启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭。
vim /etc/fstab
注释掉最后一行。
二、安装docker(三个节点)
1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
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
5、启动docker
systemctl restart docker
systemctl enable docker
三、安装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
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"
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
五、集群初始化(主节点)
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 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
在两个备机执行改语句,加入集群,结果如下:
提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。
kubectl get nodes
七、安装网络插件——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。
2、查看服务状态,都是running了
再次查看节点状态,发现所有的节点都是 <font color=“#dd00dd”>Ready</font> 的状态了。
八、部署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
使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。
kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system
等待一会后查看events,发现终于拉取成功了。
查看pod和svc状态,都是running的。
kubectl get pod,svc -A
九、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类型,暴露到外部。
3、apply修改后的recommended.yaml
kubectl apply -f recommended.yaml
4、查看kubernetes-dashboard的pod状态,都已经是running的
kubectl get pods -n kubernetes-dashboard
5、访问网址
https://NodeIP:30001。
我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001。
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}')
7、使用输出的token登录Dashboard。
可以查看当前k8s的相关信息,例如nodes,namespace等。
十、使用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
nginx-deployment 部署的2个 pod 全部成功。
查看两个nginx分配的ip。
kubectl get pods -o wide -n ns-test
访问测试:
curl http://10.0.181.5
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
访问测试:
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
测试如下:
浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK