kubernetes安装:
master,etcd:
node:
前提:基于主机名通信;
时间同步;
关闭firewalld和iptables.service
OS:centos7.3,extra
步骤:
etcd cluster,仅master节点;
flannel,集群的所有节点;
配置k8s的master:仅master节点:kubernetes-master
启动的服务:kube-apiserver,kube-scheduler,kube-controller-manager
配置的K8s的node节点:kubernetes-node
先设定启动docker服务;
启动的k8s服务:kube-proxy,kubelet
kubeadm:
1、master,nodes安装kubelet,kubeadm,docker
2、master:kubeadm init
3、nodes:kubeadm join
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
关闭firewalld,selinux
1、配置yum源:
docker yum源:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#阿里云yum源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
#docker yum源
cat >> /etc/yum.repos.d/docker.repo <<EOF
[docker-repo]
name=Docker Repository
baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7
enabled=1
gpgcheck=0
EOF
kubernertes yum源:
cat >> /etc/yum.repos.d/k8s.repo <<EOF
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
EOF
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
若要使用key:
# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
# yum --import yum-key.gpg
其它yum源:
wget http://mirrors.aliyun.com/repo/Centos-7.repo
2、master端操作:
# yum install -y docker-ce kubelet kubeadm kubectl
# rpm -ql docker-ce
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd-ce
/usr/lib/systemd/system/docker.service
/usr/lib/systemd/system/docker.socket
/var/lib/docker-engine/distribution_based_engine-ce.json
# rpm -ql kubelet
/etc/kubernetes/manifests
/etc/sysconfig/kubelet
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service
# rpm -ql kubeadm
/usr/bin/kubeadm
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# rpm -ql kubectl
/usr/bin/kubectl
# vi /usr/lib/systemd/system/docker.service
Environment="HTTPS_PROXY=http://www.ik8s.io:10080
Environment=""NO_PROXY=127.0.0.0.8,192.168.31.0/16"
# systemctl daemon-reload
# systemctl start docker.service
# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
# systemctl enable docker.service
# systemctl enable kubelet
# ss -tnl
# vi /etc/sysconfig/kubelet #禁用swap
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
# kubeadm init --help
# kubeadm init --kubernetes-version=stable-1.11 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
# kubeadm init --kubernetes-version=stable-1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
--kubernetes-version=stable-1.11 #指定kubernetes版本
--pod-network-cidr=10.244.0.0/16 #指定pod的网段
--service-cidr=10.96.0.0/12 #指定service的网段
--ignore-preflight-errors=Swap #忽略swap
初始化失败,国内网站无法访问dl.k8s.io/,因此需要事先把这些镜像拉取下来:
could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
方法1:有个墙外的代理服务器,对docker配置代理,需修改/etc/sysconfig/docker文件,添加:
HTTP_PROXY=http://proxy_ip:port
http_proxy=$HTTP_PROXY
重启docker:systemctl restart docker
# docker image ls
# kubeadm config images pull
# kubeadm config images list #初始化时需要的镜像
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
方法2:通过 docker.io/mirrorgooglecontainers中转一下https://hub.docker.com/u/mirrorgooglecontainers
# kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x #下载需要的镜像
# docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' |sh -x #重命名镜像
# docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x #删除mirrorgooglecontainers镜像
# docker pull docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.0
# docker pull docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.0
# docker pull docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.0
# docker pull docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0
# docker pull docker.io/mirrorgooglecontainers/pause:3.1
# docker pull docker.io/mirrorgooglecontainers/etcd:3.3.10
# docker tag mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
# docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
# docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
# docker tag mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
# docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
coredns没包含在docker.io/mirrorgooglecontainers中,需要手工从coredns官方镜像转换下。
# docker pull coredns/coredns:1.3.1
# docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
# docker rmi coredns/coredns:1.3.1
master初始化:
# kubeadm init --kubernetes-version=stable-1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
# kubectl get -h
# kubectl get cs #kubectl get componentstatus
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
或:
# kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU
因为后面要安装网络插件flannel ,所有这里要添加参数, --pod-network-cidr=10.244.0.0/16,10.244.0.0/16是flannel插件固定使用的ip段,它的值取决于你准备安装哪个网络插件
如果要自定义配置,先kubeadm config print init-defaults >kubeadm.conf,再修改,改完指定配置文件路径--config /root/kubeadm.conf
指定Kubenetes版本--kubernetes-version,如果不指定该参数,会从google网站下载最新的版本信息,因为它的默认值是stable-1。
因为使用的是虚拟机,只分配一个cpu,所以指定了参数--ignore-preflight-errors=NumCPU,如果你的cpu足够,不要添加这个参数.
初始化参数说明:
-apiserver-advertise-address string
API Server将要广播的监听地址。如指定为 `0.0.0.0` 将使用缺省的网卡地址。
--apiserver-bind-port int32 缺省值: 6443
API Server绑定的端口
--apiserver-cert-extra-sans stringSlice
可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。
--cert-dir string 缺省值: "/etc/kubernetes/pki"
证书的存储路径。
--config string
kubeadm配置文件的路径。警告:配置文件的功能是实验性的。
--cri-socket string 缺省值: "/var/run/dockershim.sock"
指明要连接的CRI socket文件
--dry-run
不会应用任何改变;只会输出将要执行的操作。
--feature-gates string
键值对的集合,用来控制各种功能的开关。可选项有:
Auditing=true|false (当前为ALPHA状态 - 缺省值=false)
CoreDNS=true|false (缺省值=true)
-h, --help
获取init命令的帮助信息
--ignore-preflight-errors stringSlice
忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。
--kubernetes-version string 缺省值: "stable-1"
为control plane选择一个特定的Kubernetes版本。
--node-name string
指定节点的名称。
--pod-network-cidr string
指明pod网络可以使用的IP地址段。 如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。
--service-cidr string 缺省值: "10.96.0.0/12"
为service的虚拟IP地址另外指定IP地址段
--service-dns-domain string 缺省值: "cluster.local"
为services另外指定域名, 例如: "myorg.internal".
--skip-token-print
不打印出由 `kubeadm init` 命令生成的默认令牌。
--token string
这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef
--token-ttl duration 缺省值: 24h0m0s
令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。
-----------------------
部署pod网络插件:flannel插件
选择flannel作为网络插件:
vim /etc/sysctl.conf,添加以下内容
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
修改后,及时生效
sysctl -p
地址:https://github.com/coreos/flannel
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel 默认会使用主机的第一张网卡,如果你有多张网卡,需要通过配置单独指定。修改 kube-flannel.yml 中的以下部分
vim kube-flannel.yml
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.10.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=ens33 #添加
# kubectl apply -f kube-flannel.yml
查看各组件的状态:
# kubectl get cs
# kubectl get componentstatus
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm1.cluster.com Ready master 13m v1.14.0
# kubectl get pod
No resources found.
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-fb8b8dccf-4sr5b 1/1 Running 0 14m
coredns-fb8b8dccf-rmj7h 1/1 Running 0 14m
etcd-vm1.cluster.com 1/1 Running 0 13m
kube-apiserver-vm1.cluster.com 1/1 Running 0 13m
kube-controller-manager-vm1.cluster.com 1/1 Running 0 13m
kube-flannel-ds-amd64-rnght 1/1 Running 0 2m30s
kube-proxy-mxjwr 1/1 Running 0 14m
kube-scheduler-vm1.cluster.com 1/1 Running 0 13m
# kubectl get ns #名称空间
NAME STATUS AGE
default Active 16m
kube-node-lease Active 16m
kube-public Active 16m
kube-system Active 16m
3、在node节点上操作:
# yum install -y docker-ce kubelet kubeadm
# vi /usr/lib/systemd/system/docker.service
Environment="HTTPS_PROXY=http://www.ik8s.io:10080
Environment=""NO_PROXY=127.0.0.0.8,192.168.31.0/16"
# vi /etc/sysconfig/kubelet #禁用swap
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
# systemctl start docker
# systemctl enable docker
# systemctl enable kubelet
注意,这里不需要启动kubelet,初始化的过程中会自动启动的,如果此时启动了会出现如下报错,忽略即可。日志在tail -f /var/log/messages
failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file “/var/lib/kubelet/config.yaml”, error: open /var/lib/kubelet/config.yaml: no such file or directory
kubeadm join 192.168.31.11:6443 --token rquyna.2jykkhlqq7zr306v \
--discovery-token-ca-cert-hash sha256:f7d07c0ba9ce136a0fb5d3a623146c51e17dfe49d69273474dc4ac902415dc79 --ignore-preflight-errors=Swap
node节点所需要的几个镜像:
k8s.gcr.io/kube-proxy-amd64:v1.10.0
k8s.gcr.io/pause-amd64:3.1
quay.io/coreos/flannel:v0.9.1-amd64(为网络插件的镜像,这里选择flannel为网络插件)
# docker pull docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0
# docker pull docker.io/mirrorgooglecontainers/pause:3.1
# docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
# docker pull coredns/coredns:1.3.1
# docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
# docker rmi coredns/coredns:1.3.1
node节点上会拉取如下镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.14.0 5cd54e388aba 10 days ago 82.1MB
k8s.gcr.io/kube-scheduler v1.14.0 00638a24688b 10 days ago 81.6MB
k8s.gcr.io/kube-apiserver v1.14.0 ecf910f40d6e 10 days ago 210MB
k8s.gcr.io/kube-controller-manager v1.14.0 b95b1efa0436 10 days ago 158MB
quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 2 months ago 52.6MB
coredns/coredns 1.3.1 eb516548c180 2 months ago 40.3MB
k8s.gcr.io/coredns 1.3.1 eb516548c180 2 months ago 40.3MB
k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 4 months ago 258MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 15 months ago 742kB
在master上查看:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm1.cluster.com Ready master 36m v1.14.0
vm2.cluster.com NotReady <none> 4m36s v1.14.0
如要剔除node节点:
# kubectl delete node vm2.cluster.com
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-fb8b8dccf-4sr5b 1/1 Running 0 36m
coredns-fb8b8dccf-rmj7h 1/1 Running 0 36m
etcd-vm1.cluster.com 1/1 Running 0 35m
kube-apiserver-vm1.cluster.com 1/1 Running 0 35m
kube-controller-manager-vm1.cluster.com 1/1 Running 0 35m
kube-flannel-ds-amd64-rnght 1/1 Running 0 24m
kube-flannel-ds-amd64-sng8b 0/1 Init:0/1 0 4m42s
kube-proxy-hptk5 0/1 ContainerCreating 0 4m42s
kube-proxy-mxjwr 1/1 Running 0 36m
kube-scheduler-vm1.cluster.com 1/1 Running 0 35m
# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-fb8b8dccf-4sr5b 1/1 Running 0 36m 10.244.0.3 vm1.cluster.com <none> <none>
coredns-fb8b8dccf-rmj7h 1/1 Running 0 36m 10.244.0.2 vm1.cluster.com <none> <none>
etcd-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none>
kube-apiserver-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none>
kube-controller-manager-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none>
kube-flannel-ds-amd64-rnght 1/1 Running 0 25m 192.168.31.11 vm1.cluster.com <none> <none>
kube-flannel-ds-amd64-sng8b 0/1 Init:0/1 0 4m55s 192.168.31.22 vm2.cluster.com <none> <none>
kube-proxy-hptk5 0/1 ContainerCreating 0 4m55s 192.168.31.22 vm2.cluster.com <none> <none>
kube-proxy-mxjwr 1/1 Running 0 36m 192.168.31.11 vm1.cluster.com <none> <none>
kube-scheduler-vm1.cluster.com 1/1 Running 0 36m 192.168.31.11 vm1.cluster.com <none> <none>
pod,service,replicaset,deployment,statefulet,daemonset,job,cronjob,node
deployment,job:pod的控制器
# kubectl version
# kubectl cluster-info
Kubernetes master is running at https://192.168.31.11:6443
KubeDNS is running at https://192.168.31.11:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=8080 --replicas=1 --generator=run-pod/v1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deploy created (dry run)
# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 0/1 1 0 69s
# kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h50m
nginx ClusterIP 10.108.178.106 <none> 80/TCP 9s
# curl 10.108.178.106
# kubectl describe service nginx
# kubectl edit svc nginx #编辑这个service
# kubectl scaled --replicas=3 deployment nginx #扩容到3个pod
# kubectl describe pods nginx
# kubectl set image deployment nginx nginx=nginx:1.15-alpine #更新镜像版本
# kubectl rollout status deployment nginx #查看更新过程,灰度
# kubectl rollout undo deployment nginx #回滚,默认是回滚到上一个版本
在外部访问,需要修改pod的类型
# kubectl edit svc nginx
spec:
clusterIP: 10.108.178.106
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx-deploy
sessionAffinity: None
type: ClusterIP --->修改问NodePort
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h39m
nginx NodePort 10.108.178.106 <none> 80:30020/TCP 48m
在浏览器访问:10.108.178.106:30020
# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl expose pod myapp --name=myapp --port=80
#实时监视watch
# kubectl get pod -w
#增加/缩减副本数量:
#kubectl scale --replicas=2 deployment myapp
#kubectl get pod
#升级
#kubectl set image deployment myapp myapp=ikubernetes/v2
#kubectl rollout status deployment myapp
#kubectl describe pod myapp-xxxx
#回滚
#kubectl rollout undo deployment myapp
#kubectl describe pod myapp-xxxx
#查看生成的iptabes规则
#iptabes -vnL