Skip syncing Pods

This commit is contained in:
Murat Kabilov 2017-04-11 18:15:11 +02:00
parent 655f6dcadb
commit db53134cbd
6 changed files with 7 additions and 124 deletions

View File

@ -115,7 +115,6 @@ bootstrap:
ImagePullPolicy: v1.PullAlways,
Resources: v1.ResourceRequirements{
Requests: *resourceList,
Limits: v1.ResourceList{},
},
Ports: []v1.ContainerPort{
{

View File

@ -190,9 +190,6 @@ func (c *Cluster) recreatePods() error {
var masterPod v1.Pod
for _, pod := range pods.Items {
role := util.PodSpiloRole(&pod)
if role == "" {
continue
}
if role == constants.PodRoleMaster {
masterPod = pod

View File

@ -68,19 +68,19 @@ func (c *Cluster) LoadResources() error {
func (c *Cluster) ListResources() error {
if c.Statefulset != nil {
c.logger.Infof("StatefulSet: %s (uid: %s)", util.NameFromMeta(c.Statefulset.ObjectMeta), c.Statefulset.UID)
c.logger.Infof("Found StatefulSet: %s (uid: %s)", util.NameFromMeta(c.Statefulset.ObjectMeta), c.Statefulset.UID)
}
for _, obj := range c.Secrets {
c.logger.Infof("Secret: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
c.logger.Infof("Found Secret: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
}
if c.Endpoint != nil {
c.logger.Infof("Endpoint: %s (uid: %s)", util.NameFromMeta(c.Endpoint.ObjectMeta), c.Endpoint.UID)
c.logger.Infof("Found Endpoint: %s (uid: %s)", util.NameFromMeta(c.Endpoint.ObjectMeta), c.Endpoint.UID)
}
if c.Service != nil {
c.logger.Infof("Service: %s (uid: %s)", util.NameFromMeta(c.Service.ObjectMeta), c.Service.UID)
c.logger.Infof("Found Service: %s (uid: %s)", util.NameFromMeta(c.Service.ObjectMeta), c.Service.UID)
}
pods, err := c.listPods()
@ -89,7 +89,7 @@ func (c *Cluster) ListResources() error {
}
for _, obj := range pods {
c.logger.Infof("Pod: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
c.logger.Infof("Found Pod: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
}
pvcs, err := c.listPersistentVolumeClaims()
@ -98,7 +98,7 @@ func (c *Cluster) ListResources() error {
}
for _, obj := range pvcs {
c.logger.Infof("PVC: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
c.logger.Infof("Found PVC: %s (uid: %s)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
}
return nil

View File

@ -3,11 +3,7 @@ package cluster
import (
"fmt"
"k8s.io/client-go/pkg/api/v1"
"github.bus.zalan.do/acid/postgres-operator/pkg/spec"
"github.bus.zalan.do/acid/postgres-operator/pkg/util"
"github.bus.zalan.do/acid/postgres-operator/pkg/util/constants"
)
func (c *Cluster) SyncCluster() {
@ -30,11 +26,6 @@ func (c *Cluster) SyncCluster() {
if err := c.syncStatefulSet(); err != nil {
c.logger.Errorf("Can't sync StatefulSets: %s", err)
}
c.logger.Debugf("Syncing Pods")
if err := c.syncPods(); err != nil {
c.logger.Errorf("Can't sync Pods: %s", err)
}
}
func (c *Cluster) syncSecrets() error {
@ -131,56 +122,4 @@ func (c *Cluster) syncStatefulSet() error {
c.logger.Infof("Pods have been recreated")
return nil
}
func (c *Cluster) syncPods() error {
curSs := c.Statefulset
ls := c.labelsSet()
namespace := c.Metadata.Namespace
listOptions := v1.ListOptions{
LabelSelector: ls.String(),
}
pods, err := c.KubeClient.Pods(namespace).List(listOptions)
if err != nil {
return fmt.Errorf("Can't get list of Pods: %s", err)
}
if int32(len(pods.Items)) != *curSs.Spec.Replicas {
//TODO: wait for Pods being created by StatefulSet
return fmt.Errorf("Number of existing Pods does not match number of replicas of the StatefulSet")
}
//First check if we have left overs from the previous rolling update
for _, pod := range pods.Items {
podName := spec.PodName{
Namespace: pod.Namespace,
Name: pod.Name,
}
match, _ := podMatchesTemplate(&pod, curSs)
if match && pod.Status.Phase == v1.PodPending {
c.logger.Infof("Waiting for left over Pod '%s'", podName)
ch := c.registerPodSubscriber(podName)
c.waitForPodLabel(ch)
c.unregisterPodSubscriber(podName)
}
}
for _, pod := range pods.Items {
if match, reason := podMatchesTemplate(&pod, curSs); match {
c.logger.Infof("Pod '%s' matches StatefulSet pod template", util.NameFromMeta(pod.ObjectMeta))
continue
} else {
c.logPodChanges(&pod, curSs, reason)
}
if util.PodSpiloRole(&pod) == constants.PodRoleMaster {
//TODO: do manual failover first
}
err = c.recreatePod(pod)
c.logger.Infof("Pod '%s' has been successfully recreated", util.NameFromMeta(pod.ObjectMeta))
}
return nil
}
}

View File

@ -3,7 +3,6 @@ package cluster
import (
"context"
"fmt"
"reflect"
"strings"
"time"
@ -45,40 +44,6 @@ func normalizeUserFlags(userFlags []string) (flags []string, err error) {
return
}
func podMatchesTemplate(pod *v1.Pod, ss *v1beta1.StatefulSet) (match bool, reason string) {
//TODO: improve me
match = false
reason = ""
if len(pod.Spec.Containers) != 1 {
reason = "new pod defines more than one container"
return
}
container := pod.Spec.Containers[0]
ssContainer := ss.Spec.Template.Spec.Containers[0]
switch {
case container.Image != ssContainer.Image:
{
reason = "new pod's container image doesn't match the current one"
}
case !reflect.DeepEqual(container.Env, ssContainer.Env):
{
reason = "new pod's container environment doesn't match the current one"
}
case !reflect.DeepEqual(container.Ports, ssContainer.Ports):
{
reason = "new pod's container ports don't match the current ones"
}
case !reflect.DeepEqual(container.Resources, ssContainer.Resources):
{
reason = "new pod's container resources don't match the current ones"
}
default:
match = true
}
return
}
func (c *Cluster) logStatefulSetChanges(old, new *v1beta1.StatefulSet, isUpdate bool, reason string) {
if isUpdate {
c.logger.Infof("StatefulSet '%s' has been changed",
@ -121,21 +86,6 @@ func (c *Cluster) logVolumeChanges(old, new spec.Volume, reason string) {
}
}
func (c *Cluster) logPodChanges(pod *v1.Pod, statefulset *v1beta1.StatefulSet, reason string) {
c.logger.Infof("Pod'%s does not match the StatefulSet's Pod template and needs to be recreated",
util.NameFromMeta(pod.ObjectMeta),
)
if len(pod.Spec.Containers) == 1 {
podContainer := pod.Spec.Containers[0]
templateContainer := statefulset.Spec.Template.Spec.Containers[0]
c.logger.Debugf("diff pod <-> statefulset\n%s", util.PrettyDiff(podContainer, templateContainer))
}
if reason != "" {
c.logger.Infof("Reason: %s", reason)
}
}
func (c *Cluster) getTeamMembers() ([]string, error) {
if c.Spec.TeamId == "" {
return nil, fmt.Errorf("No teamId specified")

View File

@ -124,8 +124,6 @@ func (c *Controller) podEventsDispatcher(stopCh <-chan struct{}) {
if subscriber, ok := c.clusters[event.ClusterName]; ok {
c.logger.Debugf("Sending %s event of Pod '%s' to the '%s' cluster channel", event.EventType, event.PodName, event.ClusterName)
go subscriber.ReceivePodEvent(event)
} else {
c.logger.Debugf("Skipping %s event of the '%s' pod", event.EventType, event.PodName)
}
case <-stopCh:
return