kubernetes-kubeadm安装 |
kubeadm
kubeadm是kubernetes官方提供的部署工具,需要在master和node节点上安装docker等组件,然后初始化,把管理端的控制服务和node上的服务都以pod的方式运行。
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
部署的拓扑图
本次实验部署:
master高可用部署:
还可以在master前面部署haproxy实现调度和master的高可用
部署的注意事项
注意:禁用swap,selinux,iptables
部署的步骤
1、master 先安装 kubelet,docker,kubeadm
2、master 节点运行 kubeadm init 初始化命令
3、验证 master 节点状态
4、在各个 node 节点安装 kubeadm、kubectl、docker 环境
5、在 node节点使用 kubeadm 命令将自己加入 k8s master(需要使用 master 生成 token 认证)
6、验证 node 节点状态
7、启动容器测试访问
①docker安装
docker安装详情: https://blog.csdn.net/wdirdo/article/details/103418001
②master节点配置docker加速器(可不配置)
# sudo mkdir -p /etc/docker
# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://wbnyx1yu.mirror.aliyuncs.com"]
}
EOF
# sudo systemctl daemon-reload
# sudo systemctl restart docker
③master节点配置阿里云仓库地址
阿里云镜像的 kubernetes 源(用于安装 kubelet kubeadm kubectl 命令)
参照: https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.6ccc2f70ITWTZ2
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
④master节点安装相kubeadm命令
# 查看版本信息
apt-cache madison kubeadm
# 安装1.16.1-00版本
apt install -y kubeadm=1.16.1-00 kubectl=1.16.1-00 kubelet=1.16.1-00
注意:kubeadm什么版本,就只能安装什么版本的kubernetes。
⑤master初始化
# 查看帮助
kubeadm init --help
# 必要的选项
--apiserver-advertise-address=172.18.4.31 #master-ip
--apiserver-bind-port=6443
--image-repository= #国内的镜像仓库
--kubernetes-version=v1.16.1
--pod-network-cidr=10.10.0.0/16 #容器地址段
--service-cidr=172.33.0.0/16 #service地址段(内部负载均衡)
--service-dns-domain= #默认是cluster.local
--ignore-preflight-errors=swap #忽略交换分区、好像不管用、直接关闭交换分区
# 查看安装指定版本kubernetes需要的镜像有哪些
kubeadm config images list --kubernetes-version v1.16.1
k8s.gcr.io/kube-apiserver:v1.16.1
k8s.gcr.io/kube-controller-manager:v1.16.1
k8s.gcr.io/kube-scheduler:v1.16.1
k8s.gcr.io/kube-proxy:v1.16.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
# 默认都是国外的镜像,除非有代理,否则下载不了
# 镜像下载 /基于阿里云下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.15-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.2
# 单master初始化
kubeadm init --apiserver-advertise-address=172.18.4.31 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.16.1 \
--pod-network-cidr=10.10.0.0/16 \
--service-cidr=172.33.0.0/16 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
# 高可用master初始化 主要是这个选项--control-plane-endpoint=172.18.4.248(vip)
# 高可用master可只初始化化任意master即可,然后其余master可以直接添加至master集群中
kubeadm init --apiserver-advertise-address=172.18.4.31 \
--control-plane-endpoint=172.18.4.248 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.16.1 \
--pod-network-cidr=10.10.0.0/16 \
--service-cidr=172.33.0.0/16 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
# 初始化化成功之后,高可用的master会出现:添加master的命令 \
# 但是直接使用给出的命令添加master节点是不行的 \
# 注:ip地址是vip或者需要加入master的主机ip
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.18.4.248:6443 --token 8zejdn.zd5ps5oqysltpddb \
--discovery-token-ca-cert-hash sha256:3cc6bf267bbb217430ba05a143d2e929a1c8725262524dff92c67bac43ed722b
- 添加master步骤(master做了高可用的情况下、只在其中一台主机初始化时)
# ①生成certs文件
kubeadm init phase upload-certs --upload-certs
# ②添加master命令:--control-plane --certificate-key(默认缺少了这个key)
kubeadm join 172.18.4.248:6443 --token 8zejdn.zd5ps5oqysltpddb \
--discovery-token-ca-cert-hash sha256:3cc6bf267bbb217430ba05a143d2e929a1c8725262524dff92c67bac43ed722b \
--control-plane --certificate-key 62c91cece36c6dc277b222e65987a899f6422db8dcb0bbf8ec63281fa5e07387
初始化成功:
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:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.18.4.31:6443 --token 09bo59.2rymk5wkh89gg0w8 \
--discovery-token-ca-cert-hash sha256:1ac8e88113a0032bd2658680b13270ba4237586d51e38e4dc2919432353deaab
⑥master配置kube证书
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# /etc/kubernetes/admin.conf该文件为认证文件,记录的是kube-apiserver的地址和相关的证书文件 \
# 其中包含kubernetes-admin的证书等信息
⑦master配置pod网络组件
- 此处配置为
flannel
网络组件
# You should now deploy a pod network to the cluster.
# Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
# https://kubernetes.io/docs/concepts/cluster-administration/addons/
kubectl apply -f [podnetwork].yaml
-
未安装时:coredns的状态(未能启动成功) 需要部署网络组件才能启动
-
安装步骤:
# ①https://github.com 访问github官网 ==>搜索flannel
# ②获取kube-flannel.yml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# ③更改为10.10.0.0/16网段,因为上面--pod-network-cidr=10.10.0.0/16为此网段
vim kube-flannel.yml
"Network": "10.10.0.0/16",
# ④配置网络组件
kubectl apply -f kube-flannel.yml
⑧添加worker nodes
# 在worker nodes节点安装kubelet,docker,kubeadm命令
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt update
apt install -y kubeadm=1.16.1-00 kubectl=1.16.1-00 kubelet=1.16.1-00
systemctl start kubelet && systemctl enable kubelet
# 添加worker nodes、在worker nodes主机执行以下命令即可
kubeadm join 172.18.4.31:6443 --token 09bo59.2rymk5wkh89gg0w8 \
--discovery-token-ca-cert-hash sha256:1ac8e88113a0032bd2658680b13270ba4237586d51e38e4dc2919432353deaab
# 注:token有时间限制、默认是一天、之后需要重新生成
-
添加worker nodes主机成功:
-
master node主机查看:
kubectl get nodes
等会儿或者重启kubelet.service后,worker nodes状态变为Ready
==> 至此、单master俩work nodes的kubernetes集群的简单部署完成。
测试单master俩work nodes的kubernetes集群
- 以下方法仅用于测试
# master node主机创建一个容器
kubectl create deployment nginx --image=nginx
# master node主机查看容器的运行状况
kubectl get deployment(deployment与上面创建时相同)
kubectl get pod
kubectl get pod -o wide #可以看到容器运行在哪个work node主机和容器ip地址等信息
# 开启一个随机端口映射供外部访问
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看开启的随机端口
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.33.0.1 <none> 443/TCP 133m
nginx NodePort 172.33.50.139 <none> 80:30849/TCP 16s
浏览器访问http://172.18.4.33:30849/或者http://172.18.4.32:30849/则可以访问nginx的index.html页面
- 172.18.4.33和172.18.4.32是work node的ip地址
网络测试
容器网络的连通性:
-
pod–pod(同主机和pod跨主机通信)
-
pod到外部
宿主机可以访问外网,那么pod也将可以访问外网。 -
外部到pod
访问nginx的index.html页面 -
node-pod
pod跨主机通信:
- 此时在172.18.4.33和172.18.4.32各运行了一个容器
- 可见pod–pod的跨主机通信是可以的,kubernetes自动打通了各节点的pod-network