它主要由节点(就可以理解成一台主机,物理机、虚拟机等)构成,分为主节点和工作节点(或从节点)。k8s需要实现etcd集群来管理分布式配置,还需要外部的网络插件实现网络架构,如Overlay网络(Flannel)。主节点上包括API服务器(API Server)、控制器管理器(Controller-Manager)、调度程序(Scheduler,执行调度任务)、分布式键值数据库etcd(存储集群和集群状态的配置数据)、kubectl实用程序。在工作节点上包括kubelet(创建、启动、删除容器等)和kube-proxy(端口转发)、Pod(一个或多个容器)。
环境准备:创建三台VM,并设置静态IP。
三台主机配置及安装的组件:
k8s-master(192.168.0.245)(8G内存+40G磁盘+2个CPU):包括etcd、kubectl等。注意主节点至少要2个CPU,否则会出问题。
k8s-worker1(192.168.0.246)(4G内存+40G磁盘+1个CPU):包括kubelet等。
k8s-worker2(192.168.0.247)(4G内存+40G磁盘+1个CPU):包括kubelet等。
配置静态IP示例:
编辑文件:etho是网卡名称
vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改Onboot=yes,bootPROTO=static
添加如下内容:IPADDR需要更换
IPADDR=192.168.0.245
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=114.114.114.114
DNS2=8.8.8.8
重启网络服务,若是重启网络服务不生效,最好重启电脑(reboot命令)
systemctl restart network
1.主节点上安装
(1)设置主机名并修改/etc/hosts文件、禁用SELinux、修改防火墙规则
修改主机名:
hostnamectl set-hostname ‘ks-master’
编辑/etc/hosts文件,添加以下内容(工作节点也要如此):
192.168.0.245 k8s-master
192.168.0.246 k8s-worker1
192.168.0.247 k8s-worker2
禁用SELinux:
setenforce 0
修改文件:vi /etc/sysconfigselinux,将SELINUX设为disabled
重启生效:reboot
修改防火墙规则:
firewall-cm --permanent --add-port=6443/tcp
firewall-cm --permanent --add-port=2379-2380/tcp
firewall-cm --permanent --add-port=10250/tcp
firewall-cm --permanent --add-port=10251/tcp
firewall-cm --permanent --add-port=10252/tcp
firewall-cm --permanent --add-port=10255/tcp
firewall-cmd --reload #重新加载防火墙
modprobe br_netfilter #生成文件/proc/sys/net/bridge/bridge-nf-call-iptables
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables #写 1 进入文件/proc/sys/net/bridge/bridge-nf-call-iptables
(2)安装Docker
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker:
sudo yum -y install docker
启动 Docker 后台服务并设置开机启动:
systemctl start docker && systemctl enable docker
验证:出现版本号表示安装成功
docker -v
(3)安装kubeadm
先加软件包存储库,编辑文件:
vi /etc/yum.repos.d/kubernetes.repo
添加以下内容:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
安装kubeadm:
yum install -y kubeadm
启动 kubelet服务并设置开机启动:
systemctl restart kubelet&& systemctl enable kubelet
(4)清楚swap,初始化kubeadm
swapoff -a #清除swap
kubeadm init
出现“successfully”表示成功。
执行下面命令(这命令会有提示的),以root身份即可使用该集群了
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
注意:若出现什么问题可以执行kubeadm reset清除安装环境,在重新初始化kubeadm init
(5)创建Overlay网络(Flannel),使不同主机的Pod通信:
export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
(6)验证
kubectl get nodes #查看所有的节点,可能不会马上就出现ready状态,大致等待了8分钟,与镜像的拉取有关,这只能取决于网络
kubectl get Pods --all-namespaces #获取Pod
2.工作节点上安装
(1)设置主机名并修改/etc/hosts文件、禁用SELinux、修改防火墙规则
修改主机名:hostnamectl set-hostname ‘ks-worker1’,其他参见主节点上安装
修改防火墙规则:
firewall-cm --permanent --add-port=10250/tcp
firewall-cm --permanent --add-port=10255/tcp
firewall-cm --permanent --add-port=30000-32767/tcp
firewall-cm --permanent --add-port=6783/tcp
firewall-cmd --reload #重新加载防火墙
modprobe br_netfilter #生成文件/proc/sys/net/bridge/bridge-nf-call-iptables
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables #写 1 进入文件/proc/sys/net/bridge/bridge-nf-call-iptables
(2)安装Docker
参见主节点上安装
(3)安装kubeadm
先加软件包存储库,编辑下列文件:
vi /etc/yum.repos.d/kubernetes.repo
添加以下内容:参见主节点上安装
kubelet服务设置开机启动:
systemctl enable kubelet
(4)清除swap, 加入主节点
swapoff -a #清除swap
kubeadm join 192.168.0.245:6443 --token kxv70u.sxcvz4u1uusanjyv \
--discovery-token-ca-cert-hash sha256:556aa9b8aa5f026b275e5358ae05c9ad194e7fc1987b270c904320b67c6c1118
出现“Node join complete”表示成功。上述命令在主节点执行kubctl之后会出现,主要就是token的要与主节点上一致。
(5)验证(在主节点上执行下列命令)
kubectl get nodes #查看所有的节点,可能不会马上就出现ready状态,大致等待了7-8分钟,与镜像的拉取有关,这只能取决于网络
附:添加可视化界面dashboard
方法一:这种方法由于连不上外网导致失败。可以参考方法二.
部署dashboard:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
查看是否安装成功,kubernetes-dashboard会running中
kubectl get pods -n kube-system
以打补丁方式修改dasboard的访问方式,修改访问port, svc是service的简称
kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
执行命令查看修改端口效果
kubectl get svc -n kube-system
效果如下:
官方默认需要使用火狐浏览器访问:https://192.168.0.245:31042,其他浏览器访问出现会不安全证书问题
有两种方式进行登录,目前就学了token方式登录,获取token:命令为:
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
将token输入即可登录
方法二.
1.下载镜像
images=(kubernetes-dashboard-amd64:v1.6.0)
for imageName in ${images[@]} ; do
docker pull k8scn/$imageName
docker tag k8scn/$imageName gcr.io/google_containers/$imageName
docker rmi k8scn/$imageName
done
2.编辑yml文件:vi kube-dashboard.yml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0
ports:
- containerPort: 9090
protocol: TCP
args:
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
serviceAccountName: kubernetes-dashboard
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 9090
nodePort: 30006
selector:
k8s-app: kubernetes-dashboard
3.创建dashboard服务:
kubectl create -f kube-dashboard.yml
4.验证,执行下列命令可以看见kubernetes-dashboard-77d95884d8-fqt8n处于Running状态表明配置成功
kubectl get pods --all-namespaces -o wide
浏览器访问:192.168.0.245:30006即可
提示:30006是在kube-dashboard.yaml 文件中nodePort 配置的,任意配置,需要在30000以上。
安装过程出现的问题以及解决方案:
1)执行命令:sysctl net.bridge.bridge-nf-call-iptables=1出现sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
解决方案:需要执行命令modprobe br_netfilter
2)获取token的命令,这个是用于在dashboard登录时用
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
常用命令:(随时更新)
(1)删除工作节点:
工作节点上执行命令:
kubeadm reset
主节点执行命令:
kubectl drain [工作节点name] --delete-local-data --force --ignore-daemonsets
kubectl delete node [工作节点name]
参考:
1.菜鸟网站Docker安装
2.书籍蒋彪《Docker微服务架构实战》